diff options
| author | Nicolás Bértolo | 2020-05-19 15:57:31 -0300 |
|---|---|---|
| committer | Andrea Corallo | 2020-05-25 09:42:10 +0100 |
| commit | 1b809f378f6263bc099da45c5e4a42c89fef8d71 (patch) | |
| tree | 1adfe55b6b0761de4f12bc0830aaab7a3296bc07 /src/alloc.c | |
| parent | 9daffe9cfe82d3b1e1e9fa8929dbb40cfed60f0f (diff) | |
| download | emacs-1b809f378f6263bc099da45c5e4a42c89fef8d71.tar.gz emacs-1b809f378f6263bc099da45c5e4a42c89fef8d71.zip | |
Improve handling of native compilation units still in use in Windows
When closing emacs will inspect all directories from which it loaded
native compilation units. If it finds a ".eln.old" file it will try to
delete it, if it fails that means that another Emacs instance is using it.
When compiling a file we rename the file that was in the output path
in case it has been loaded into another Emacs instance.
When deleting a package we move any ".eln" or ".eln.old" files in the
package folder that we can't delete to `package-user-dir`. Emacs will
check that directory when closing and delete them.
* lisp/emacs-lisp/comp.el (comp--replace-output-file): Function called
from C code to finish the compilation process. It performs renaming of
the old file if necessary.
* lisp/emacs-lisp/package.el (package--delete-directory): Function to
delete a package directory. It moves native compilation units that it
can't delete to `package-user-dir'.
* src/alloc.c (cleanup_vector): Call dispose_comp_unit().
(garbage_collect): Call finish_delayed_disposal_of_comp_units().
* src/comp.c: Restore the signal mask using unwind-protect. Store
loaded native compilation units in a hash table for disposal on
close. Store filenames of native compilation units GC'd in a linked
list to finish their disposal when the GC is over.
(clean_comp_unit_directory): Delete all *.eln.old files in a
directory.
(clean_package_user_dir_of_old_comp_units): Delete all *.eln.old files
in `package-user-dir'.
(dispose_all_remaining_comp_units): Dispose of native compilation
units that are still loaded.
(dispose_comp_unit): Close handle and cleanup directory or arrange for
later cleanup if DELAY is true.
(finish_delayed_disposal_of_comp_units): Dispose of native compilation
units that were GC'd.
(register_native_comp_unit): Register native compilation unit for
disposal when Emacs closes.
* src/comp.h: Introduce cfile member in Lisp_Native_Comp_Unit.
Add declarations of functions that: clean directories of unused native
compilation units, handle disposal of native compilation units.
* src/emacs.c (kill-emacs): Dispose all remaining compilation units
right right before calling exit().
* src/eval.c (internal_condition_case_3, internal_condition_case_4):
Add functions.
* src/lisp.h (internal_condition_case_3, internal_condition_case_4):
Add functions.
* src/pdumper.c (dump_do_dump_relocation): Set cfile to a copy of the
Lisp string specifying the file path.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/src/alloc.c b/src/alloc.c index 76d49d2efd6..b892022125e 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -3119,8 +3119,7 @@ cleanup_vector (struct Lisp_Vector *vector) | |||
| 3119 | { | 3119 | { |
| 3120 | struct Lisp_Native_Comp_Unit *cu = | 3120 | struct Lisp_Native_Comp_Unit *cu = |
| 3121 | PSEUDOVEC_STRUCT (vector, Lisp_Native_Comp_Unit); | 3121 | PSEUDOVEC_STRUCT (vector, Lisp_Native_Comp_Unit); |
| 3122 | eassert (cu->handle); | 3122 | dispose_comp_unit (cu, true); |
| 3123 | dynlib_close (cu->handle); | ||
| 3124 | } | 3123 | } |
| 3125 | } | 3124 | } |
| 3126 | 3125 | ||