OSDN Git Service

* dcrt0.cc (dll_crt0_0): Eliminate muto::init call.
authorcgf <cgf>
Tue, 8 Mar 2005 05:05:01 +0000 (05:05 +0000)
committercgf <cgf>
Tue, 8 Mar 2005 05:05:01 +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 013f647..a94ab0a 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 b269b21..df639c2 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 b77b4c0..a7b650a 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 f946bc7..20995da 100644 (file)
@@ -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;
 }
 
index 90e70a2..f2f852c 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) \