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
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-04-23 07:24:21 +0400
committerChristopher Faylor <me@cgf.cx>2005-04-23 07:24:21 +0400
commitbc79d164539c13d40ea7f3eac012bbabc17579cb (patch)
tree0b4fafc4d63fe7463d07fd51091c1ddc346a00ee /winsup
parent098a429002612f8ceadbbd9c3bbdec7e944ee8f7 (diff)
* shared.cc (user_shared_initialize): Implement locking similar to shared_info
when initializing shared region.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/shared.cc6
2 files changed, 10 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 27b48aacb..6cf5997e2 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2005-04-22 Christopher Faylor <cgf@timesys.com>
+ * shared.cc (user_shared_initialize): Implement locking similar to
+ shared_info when initializing shared region.
+
+2005-04-22 Christopher Faylor <cgf@timesys.com>
+
* fhandler.h (dev_console::set_color): Define new function.
(dev_console::set_default_attr): Ditto, moved from fhandler_console.
(dev_console::fillin_info): Ditto. Accommodate this change throughout
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
index 48caefff0..8798b2c4c 100644
--- a/winsup/cygwin/shared.cc
+++ b/winsup/cygwin/shared.cc
@@ -172,8 +172,9 @@ user_shared_initialize (bool reinit)
ProtectHandleINH (cygwin_user_h);
debug_printf ("user shared version %x", user_shared->version);
+ DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &user_shared->version, USER_VERSION_MAGIC);
/* Initialize the Cygwin per-user shared, if necessary */
- if (!user_shared->version)
+ if (!sversion)
{
user_shared->version = USER_VERSION_MAGIC;
debug_printf ("initializing user shared");
@@ -189,6 +190,9 @@ user_shared_initialize (bool reinit)
multiple_cygwin_problem ("user shared memory version", user_shared->version, USER_VERSION_MAGIC);
else if (user_shared->cb != sizeof (*user_shared))
multiple_cygwin_problem ("user shared memory size", user_shared->cb, sizeof (*user_shared));
+ else
+ while (!user_shared->cb)
+ low_priority_sleep (0); // Should be hit only very very rarely
}
void