From 65156807134f7d430f9e32086a228e4a3ad4f386 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 11 Jul 2009 15:45:45 +0000 Subject: [PATCH] (directory_files_internal_w32_unwind) [WINDOWSNT]: New function. (directory_files_internal) [WINDOWSNT]: Bind w32-get-true-file-attributes to either t or nil, depending whether the filesystem of the directory is fast or slow. --- src/ChangeLog | 15 +++++++++++++++ src/dired.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index a75a48b8b9b..3d952982237 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,18 @@ +2009-07-11 Eli Zaretskii + + * dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]: New + function. + (directory_files_internal) [WINDOWSNT]: Bind + w32-get-true-file-attributes to either t or nil, depending whether + the filesystem of the directory is fast or slow. + + * w32.c (logon_network_drive): Don't assume PATH is an absolute + file name. + (is_slow_fs): New function. + (stat): Use it to determine whether to issue more system calls to + get accurate file attributes, when w32-get-true-file-attributes is + `local'. + 2009-07-10 Jan Djärv * xfns.c (Fx_select_font): Remember last font selected in diff --git a/src/dired.c b/src/dired.c index 1c2149c7d2c..2d2f196c8ff 100644 --- a/src/dired.c +++ b/src/dired.c @@ -104,6 +104,7 @@ extern void filemodestring P_ ((struct stat *, char *)); extern int completion_ignore_case; extern Lisp_Object Qcompletion_ignore_case; extern Lisp_Object Vcompletion_regexp_list; +extern Lisp_Object Vw32_get_true_file_attributes; Lisp_Object Vcompletion_ignored_extensions; Lisp_Object Qdirectory_files; @@ -115,6 +116,14 @@ Lisp_Object Qfile_attributes_lessp; static int scmp P_ ((unsigned char *, unsigned char *, int)); +#ifdef WINDOWSNT +Lisp_Object +directory_files_internal_w32_unwind (Lisp_Object arg) +{ + Vw32_get_true_file_attributes = arg; + return Qnil; +} +#endif Lisp_Object directory_files_internal_unwind (dh) @@ -146,6 +155,9 @@ directory_files_internal (directory, full, match, nosort, attrs, id_format) int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; DIRENTRY *dp; +#ifdef WINDOWSNT + Lisp_Object w32_save = Qnil; +#endif /* Because of file name handlers, these functions might call Ffuncall, and cause a GC. */ @@ -194,6 +206,34 @@ directory_files_internal (directory, full, match, nosort, attrs, id_format) record_unwind_protect (directory_files_internal_unwind, make_save_value (d, 0)); +#ifdef WINDOWSNT + if (attrs) + { + extern Lisp_Object Qlocal; + extern int is_slow_fs (const char *); + + /* Do this only once to avoid doing it (in w32.c:stat) for each + file in the directory, when we call Ffile_attributes below. */ + record_unwind_protect (directory_files_internal_w32_unwind, + Vw32_get_true_file_attributes); + w32_save = Vw32_get_true_file_attributes; + if (EQ (Vw32_get_true_file_attributes, Qlocal)) + { + char *dirnm = SDATA (dirfilename); + char *fn = alloca (SBYTES (dirfilename) + 1); + + strncpy (fn, SDATA (dirfilename), SBYTES (dirfilename)); + fn[SBYTES (dirfilename)] = '\0'; + /* w32.c:stat will notice these bindings and avoid calling + GetDriveType for each file. */ + if (is_slow_fs (fn)) + Vw32_get_true_file_attributes = Qnil; + else + Vw32_get_true_file_attributes = Qt; + } + } +#endif + directory_nbytes = SBYTES (directory); re_match_object = Qt; @@ -310,6 +350,10 @@ directory_files_internal (directory, full, match, nosort, attrs, id_format) BLOCK_INPUT; closedir (d); UNBLOCK_INPUT; +#ifdef WINDOWSNT + if (attrs) + Vw32_get_true_file_attributes = w32_save; +#endif /* Discard the unwind protect. */ specpdl_ptr = specpdl + count; -- 2.39.2