diff options
author | Christopher Faylor <me@cgf.cx> | 2005-03-08 05:05:02 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-03-08 05:05:02 +0000 |
commit | 18edcecfbf74f23bffeefcaca1722407f6a9f597 (patch) | |
tree | 659de52828393063ae25a9e158cef9a516bf2cd1 | |
parent | 453456187764ae9cd1911693bf4d68e85898b9cf (diff) | |
download | cygnal-18edcecfbf74f23bffeefcaca1722407f6a9f597.tar.gz cygnal-18edcecfbf74f23bffeefcaca1722407f6a9f597.tar.bz2 cygnal-18edcecfbf74f23bffeefcaca1722407f6a9f597.zip |
* dcrt0.cc (dll_crt0_0): Eliminate muto::init call.
* sync.h (locker): New, currently unused class.
(muto::init): Eliminate.
* sync.cc (muto::init): Ditto.
(muto::init): Eliminate critical section lock and instead use name as a guard
to prevent against multiple attempts to initialize the same muto.
* pinfo.cc (pinfo::init): Set myself procinfo when not execing and pid matches
windows pid or cygwin pid.
-rw-r--r-- | winsup/cygwin/ChangeLog | 12 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 1 | ||||
-rw-r--r-- | winsup/cygwin/pinfo.cc | 3 | ||||
-rw-r--r-- | winsup/cygwin/sync.cc | 28 | ||||
-rw-r--r-- | winsup/cygwin/sync.h | 9 |
5 files changed, 30 insertions, 23 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 013f64797..a94ab0a46 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2005-03-08 Christopher Faylor <cgf@timesys.com> + + * dcrt0.cc (dll_crt0_0): Eliminate muto::init call. + * sync.h (locker): New, currently unused class. + (muto::init): Eliminate. + * sync.cc (muto::init): Ditto. + (muto::init): Eliminate critical section lock and instead use name as a + guard to prevent against multiple attempts to initialize the same muto. + + * pinfo.cc (pinfo::init): Set myself procinfo when not execing and pid + matches windows pid or cygwin pid. + 2005-03-06 Pavel Tsekov <ptsekov@gmx.net> * path.cc (mount_info::read_cygdrive_info_from_registry): Use the user diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index b269b21d1..df639c20f 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -574,7 +574,6 @@ void __stdcall dll_crt0_0 () { wincap.init (); - muto::init (); initial_env (); char zeros[sizeof (child_proc_info->zero)] = {0}; diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index b77b4c0d2..a7b650a98 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -173,7 +173,8 @@ void pinfo::init (pid_t n, DWORD flag, HANDLE h0) { h = NULL; - if (myself && n == myself->pid) + if (myself && !(flag & PID_EXECED) + && (n == myself->pid || (DWORD) n == myself->dwProcessId)) { procinfo = myself; destroy = 0; diff --git a/winsup/cygwin/sync.cc b/winsup/cygwin/sync.cc index f946bc705..20995da2d 100644 --- a/winsup/cygwin/sync.cc +++ b/winsup/cygwin/sync.cc @@ -31,12 +31,6 @@ DWORD NO_COPY muto::exiting_thread; CRITICAL_SECTION NO_COPY muto::init_lock; void -muto::init () -{ - InitializeCriticalSection (&init_lock); -} - -void muto::grab () { tls = &_my_tls; @@ -46,23 +40,19 @@ muto::grab () muto * muto::init (const char *s) { - muto *res = this; - EnterCriticalSection (&init_lock); - if (!bruteforce) + char *already_exists = (char *) InterlockedExchangePointer (&name, s); + if (already_exists) + while (!bruteforce) + low_priority_sleep (0); + else { waiters = -1; - bruteforce = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); /* Create event which is used in the fallback case when blocking is necessary */ - if (bruteforce) - name = s; - else - { - DWORD oerr = GetLastError (); - SetLastError (oerr); - res = NULL; - } + bruteforce = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); + if (!bruteforce) + api_fatal ("couldn't allocate muto '%s', %E", s); } - LeaveCriticalSection (&init_lock); + return this; } diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h index 90e70a243..f2f852c78 100644 --- a/winsup/cygwin/sync.h +++ b/winsup/cygwin/sync.h @@ -40,10 +40,15 @@ public: void upforgrabs () {tls = this;} // just set to an invalid address void grab () __attribute__ ((regparm (1))); static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();} - static void init (); }; -extern muto muto_start; +class locker +{ + muto *room; +public: + locker (muto *m) {room = m; room->acquire ();} + ~locker () {room->release ();} +}; /* Use a statically allocated buffer as the storage for a muto */ #define new_muto(__name) \ |