]> sourceware.org Git - newlib-cygwin.git/commitdiff
* dcrt0.cc (dll_crt0_0): Eliminate muto::init call.
authorChristopher Faylor <me@cgf.cx>
Tue, 8 Mar 2005 05:05:02 +0000 (05:05 +0000)
committerChristopher Faylor <me@cgf.cx>
Tue, 8 Mar 2005 05:05:02 +0000 (05:05 +0000)
* 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.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/pinfo.cc
winsup/cygwin/sync.cc
winsup/cygwin/sync.h

index 013f64797b459f6b4f613fe46235fbcb10bb1514..a94ab0a46488d9fab1c3179fd567a929eab75fa4 100644 (file)
@@ -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
index b269b21d1d6c01848477daca9aa1935c39684f7d..df639c20f501291ee46a97c3aa8f97df9ee454fe 100644 (file)
@@ -574,7 +574,6 @@ void __stdcall
 dll_crt0_0 ()
 {
   wincap.init ();
-  muto::init ();
   initial_env ();
 
   char zeros[sizeof (child_proc_info->zero)] = {0};
index b77b4c0d2b081674c30dc43c142416ec1ef8a6b2..a7b650a988c0628bf0059891edbab251b11f8e19 100644 (file)
@@ -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;
index f946bc7050b54a70e6454bd626b0d5bffc3378f4..20995da2d6e5a4fdd9c218b3de496c8e0b78bf47 100644 (file)
@@ -30,12 +30,6 @@ details. */
 DWORD NO_COPY muto::exiting_thread;
 CRITICAL_SECTION NO_COPY muto::init_lock;
 
-void
-muto::init ()
-{
-  InitializeCriticalSection (&init_lock);
-}
-
 void
 muto::grab ()
 {
@@ -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;
 }
 
index 90e70a243d6a59fa7a8aad07768836382e3264dc..f2f852c7854a36fdfb57683c452bcc4aecf2d247 100644 (file)
@@ -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) \
This page took 0.034816 seconds and 5 git commands to generate.