diff options
author | Christopher Faylor <me@cgf.cx> | 2005-04-23 03:24:21 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-04-23 03:24:21 +0000 |
commit | bc79d164539c13d40ea7f3eac012bbabc17579cb (patch) | |
tree | 0b4fafc4d63fe7463d07fd51091c1ddc346a00ee /winsup | |
parent | 098a429002612f8ceadbbd9c3bbdec7e944ee8f7 (diff) | |
download | newlib-bc79d164539c13d40ea7f3eac012bbabc17579cb.zip newlib-bc79d164539c13d40ea7f3eac012bbabc17579cb.tar.gz newlib-bc79d164539c13d40ea7f3eac012bbabc17579cb.tar.bz2 |
* shared.cc (user_shared_initialize): Implement locking similar to shared_info
when initializing shared region.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/shared.cc | 6 |
2 files changed, 10 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 27b48aa..6cf5997 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 48caeff..8798b2c 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 |