# HG changeset patch # User Eli Zaretskii # Date 1247327113 0 # Node ID 13472a13e8f3fb72e077c6d03533565a2c37caac # Parent fe78cff95301d3278ee84c36486e0462aeecb94d (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. diff -r fe78cff95301 -r 13472a13e8f3 src/dired.c --- a/src/dired.c Sat Jul 11 15:44:36 2009 +0000 +++ b/src/dired.c Sat Jul 11 15:45:13 2009 +0000 @@ -104,6 +104,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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;