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
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-03-08 08:05:02 +0300
committerChristopher Faylor <me@cgf.cx>2005-03-08 08:05:02 +0300
commit18edcecfbf74f23bffeefcaca1722407f6a9f597 (patch)
tree659de52828393063ae25a9e158cef9a516bf2cd1
parent453456187764ae9cd1911693bf4d68e85898b9cf (diff)
* 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/ChangeLog12
-rw-r--r--winsup/cygwin/dcrt0.cc1
-rw-r--r--winsup/cygwin/pinfo.cc3
-rw-r--r--winsup/cygwin/sync.cc28
-rw-r--r--winsup/cygwin/sync.h9
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) \