(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.
This commit is contained in:
Eli Zaretskii 2009-07-11 15:45:45 +00:00
parent be4c6380de
commit 6515680713
2 changed files with 59 additions and 0 deletions

View 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

View 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));
#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;