changeset 103860:13472a13e8f3

(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.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 11 Jul 2009 15:45:13 +0000
parents fe78cff95301
children 2359749268a7
files src/dired.c
diffstat 1 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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;