* path.cc (etc::dir_changed): Revert muto changes since function is

called under lock condition anyway.
This commit is contained in:
Corinna Vinschen 2012-07-31 19:56:32 +00:00
parent 68e41cfcf4
commit bc025aada5
2 changed files with 25 additions and 28 deletions

View File

@ -1,3 +1,8 @@
2012-07-31 Corinna Vinschen <corinna@vinschen.de>
* path.cc (etc::dir_changed): Revert muto changes since function is
called under lock condition anyway.
2012-07-31 Corinna Vinschen <corinna@vinschen.de> 2012-07-31 Corinna Vinschen <corinna@vinschen.de>
* path.cc (etc::dir_changed): Change `io' to a static NO_COPY * path.cc (etc::dir_changed): Change `io' to a static NO_COPY

View File

@ -4311,12 +4311,11 @@ etc::test_file_change (int n)
bool bool
etc::dir_changed (int n) etc::dir_changed (int n)
{ {
static muto lock NO_COPY;
static HANDLE changed_h NO_COPY;
/* io MUST be static because NtNotifyChangeDirectoryFile works asynchronously. /* io MUST be static because NtNotifyChangeDirectoryFile works asynchronously.
It may write into io after the function has left, which may result in all It may write into io after the function has left, which may result in all
sorts of stack corruption. */ sorts of stack corruption. */
static IO_STATUS_BLOCK io NO_COPY; static IO_STATUS_BLOCK io NO_COPY;
static HANDLE changed_h NO_COPY;
if (!change_possible[n]) if (!change_possible[n])
{ {
@ -4326,43 +4325,36 @@ etc::dir_changed (int n)
{ {
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES attr;
lock.init ("etc_dir_changed_lock")->acquire (); path_conv dir ("/etc");
if (!changed_h) status = NtOpenFile (&changed_h, SYNCHRONIZE | FILE_LIST_DIRECTORY,
dir.get_object_attr (attr, sec_none_nih), &io,
FILE_SHARE_VALID_FLAGS, FILE_DIRECTORY_FILE);
if (!NT_SUCCESS (status))
{ {
path_conv dir ("/etc");
status = NtOpenFile (&changed_h,
SYNCHRONIZE | FILE_LIST_DIRECTORY,
dir.get_object_attr (attr, sec_none_nih),
&io, FILE_SHARE_VALID_FLAGS,
FILE_DIRECTORY_FILE);
if (!NT_SUCCESS (status))
{
#ifdef DEBUGGING #ifdef DEBUGGING
system_printf ("NtOpenFile (%S) failed, %p", system_printf ("NtOpenFile (%S) failed, %p",
dir.get_nt_native_path (), status); dir.get_nt_native_path (), status);
#endif #endif
changed_h = INVALID_HANDLE_VALUE; changed_h = INVALID_HANDLE_VALUE;
} }
else else
{ {
status = NtNotifyChangeDirectoryFile (changed_h, NULL, NULL, status = NtNotifyChangeDirectoryFile (changed_h, NULL, NULL,
NULL, &io, NULL, 0, NULL, &io, NULL, 0,
FILE_NOTIFY_CHANGE_LAST_WRITE FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_FILE_NAME, | FILE_NOTIFY_CHANGE_FILE_NAME,
FALSE); FALSE);
if (!NT_SUCCESS (status)) if (!NT_SUCCESS (status))
{ {
#ifdef DEBUGGING #ifdef DEBUGGING
system_printf ("NtNotifyChangeDirectoryFile (1) failed, " system_printf ("NtNotifyChangeDirectoryFile (1) failed, %p",
"%p", status); status);
#endif #endif
NtClose (changed_h); NtClose (changed_h);
changed_h = INVALID_HANDLE_VALUE; changed_h = INVALID_HANDLE_VALUE;
}
} }
memset (change_possible, true, sizeof (change_possible));
} }
lock.release (); memset (change_possible, true, sizeof (change_possible));
} }
if (changed_h == INVALID_HANDLE_VALUE) if (changed_h == INVALID_HANDLE_VALUE)