Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2012-07-31 23:56:32 +0400
committerCorinna Vinschen <corinna@vinschen.de>2012-07-31 23:56:32 +0400
commitbc025aada5956d6a1bd3e12526b24c80ceb6e7d9 (patch)
tree1d42e5d5c5340486b34ec46639bd029140cfafc2
parent68e41cfcf4212e856ed3e75303ee11c7077d5759 (diff)
* path.cc (etc::dir_changed): Revert muto changes since function is
called under lock condition anyway.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/path.cc48
2 files changed, 25 insertions, 28 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index bf2f3365d..08d9d741c 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
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>
+
* path.cc (etc::dir_changed): Change `io' to a static NO_COPY
variable. Explain why. Add a muto to guard overwriting the changed_h
handle by multiple concurrent threads.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 859e95878..d1a881c39 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -4311,12 +4311,11 @@ etc::test_file_change (int n)
bool
etc::dir_changed (int n)
{
- static muto lock NO_COPY;
- static HANDLE changed_h NO_COPY;
/* io MUST be static because NtNotifyChangeDirectoryFile works asynchronously.
It may write into io after the function has left, which may result in all
sorts of stack corruption. */
static IO_STATUS_BLOCK io NO_COPY;
+ static HANDLE changed_h NO_COPY;
if (!change_possible[n])
{
@@ -4326,43 +4325,36 @@ etc::dir_changed (int n)
{
OBJECT_ATTRIBUTES attr;
- lock.init ("etc_dir_changed_lock")->acquire ();
- if (!changed_h)
+ 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))
{
- 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
- system_printf ("NtOpenFile (%S) failed, %p",
- dir.get_nt_native_path (), status);
+ system_printf ("NtOpenFile (%S) failed, %p",
+ dir.get_nt_native_path (), status);
#endif
- changed_h = INVALID_HANDLE_VALUE;
- }
- else
- {
- status = NtNotifyChangeDirectoryFile (changed_h, NULL, NULL,
+ changed_h = INVALID_HANDLE_VALUE;
+ }
+ else
+ {
+ status = NtNotifyChangeDirectoryFile (changed_h, NULL, NULL,
NULL, &io, NULL, 0,
FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_FILE_NAME,
FALSE);
- if (!NT_SUCCESS (status))
- {
+ if (!NT_SUCCESS (status))
+ {
#ifdef DEBUGGING
- system_printf ("NtNotifyChangeDirectoryFile (1) failed, "
- "%p", status);
+ system_printf ("NtNotifyChangeDirectoryFile (1) failed, %p",
+ status);
#endif
- NtClose (changed_h);
- changed_h = INVALID_HANDLE_VALUE;
- }
+ NtClose (changed_h);
+ 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)