]> git.eshelyaron.com Git - emacs.git/commitdiff
(directory_files_internal_w32_unwind) [WINDOWSNT]: New function.
authorEli Zaretskii <eliz@gnu.org>
Sat, 11 Jul 2009 15:45:45 +0000 (15:45 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sat, 11 Jul 2009 15:45:45 +0000 (15:45 +0000)
(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
src/dired.c

index a75a48b8b9b9473c837e64c5a1ce063f0dc41dfe..3d95298223709d8d9714decd390f6a47d2a26a3b 100644 (file)
@@ -1,3 +1,18 @@
+2009-07-11  Eli Zaretskii  <eliz@gnu.org>
+
+       * 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  <jan.h.d@swipnet.se>
 
        * xfns.c (Fx_select_font): Remember last font selected in
index 1c2149c7d2c2625531f6aae5932bd29bc2de31b4..2d2f196c8ffa32af1703d8d1c6d2e644b345e8ec 100644 (file)
@@ -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));
 \f
+#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;