diff options
| author | Paul Eggert | 2017-08-12 14:00:17 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-08-12 15:14:45 -0700 |
| commit | a6ad98ad66e1d0c0dac5f25ba91e11d0cf9da725 (patch) | |
| tree | 183748df6a5b71f1b48deecc824eef27939ff2f8 /lisp | |
| parent | 9eb30cb03613ae158c870d603a05a6a6393dc485 (diff) | |
| download | emacs-a6ad98ad66e1d0c0dac5f25ba91e11d0cf9da725.tar.gz emacs-a6ad98ad66e1d0c0dac5f25ba91e11d0cf9da725.zip | |
Improve make-temp-file performance on local files
For the motivation behind this patch, please see Bug#28023 and:
http://emacshorrors.com/posts/make-temp-name.html
Although, given the recent changes to Tramp, the related security
problem in make-temp-file is already fixed, make-temp-file still has
several unnecessary system calls. In the typical case on GNU/Linux,
this patch replaces 8 syscalls (symlink, open, close, readlinkat, uname,
getpid, unlink, umask) by 2 (open, close).
* admin/merge-gnulib (GNULIB_MODULES): Add tempname, now
that Emacs is using it directly.
* configure.ac (AUTO_DEPEND): Remove AC_SYS_LONG_FILE_NAMES;
no longer needed.
* lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
* lisp/files.el (files--make-magic-temp-file): Rename from
make-temp-file.
(make-temp-file): Use make-temp-file-internal for
non-magic file names.
* src/fileio.c: Include tempname.h.
(make_temp_name_tbl, make_temp_name_count)
(make_temp_name_count_initialized_p, make_temp_name): Remove.
(Fmake_temp_file_internal): New function.
(Fmake_temp_name): Use it.
* src/filelock.c (get_boot_time): Use Fmake_temp_file_internal
instead of make_temp_name.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/files.el | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lisp/files.el b/lisp/files.el index 0fe7f9c522a..19573cdf7b2 100644 --- a/lisp/files.el +++ b/lisp/files.el | |||
| @@ -1407,6 +1407,15 @@ You can then use `write-region' to write new data into the file. | |||
| 1407 | If DIR-FLAG is non-nil, create a new empty directory instead of a file. | 1407 | If DIR-FLAG is non-nil, create a new empty directory instead of a file. |
| 1408 | 1408 | ||
| 1409 | If SUFFIX is non-nil, add that at the end of the file name." | 1409 | If SUFFIX is non-nil, add that at the end of the file name." |
| 1410 | (let ((absolute-prefix (expand-file-name prefix temporary-file-directory))) | ||
| 1411 | (if (find-file-name-handler absolute-prefix 'write-region) | ||
| 1412 | (files--make-magic-temp-file prefix dir-flag suffix) | ||
| 1413 | (make-temp-file-internal absolute-prefix | ||
| 1414 | (if dir-flag t) (or suffix ""))))) | ||
| 1415 | |||
| 1416 | (defun files--make-magic-temp-file (prefix &optional dir-flag suffix) | ||
| 1417 | "Implement (make-temp-file PREFIX DIR-FLAG SUFFIX). | ||
| 1418 | This implementation works on magic file names." | ||
| 1410 | ;; Create temp files with strict access rights. It's easy to | 1419 | ;; Create temp files with strict access rights. It's easy to |
| 1411 | ;; loosen them later, whereas it's impossible to close the | 1420 | ;; loosen them later, whereas it's impossible to close the |
| 1412 | ;; time-window of loose permissions otherwise. | 1421 | ;; time-window of loose permissions otherwise. |