* 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.
This commit is contained in:
parent
4534561877
commit
18edcecfbf
@ -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
|
||||
|
@ -574,7 +574,6 @@ void __stdcall
|
||||
dll_crt0_0 ()
|
||||
{
|
||||
wincap.init ();
|
||||
muto::init ();
|
||||
initial_env ();
|
||||
|
||||
char zeros[sizeof (child_proc_info->zero)] = {0};
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user