mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-24 22:46:15 +01:00
windows XP threads: fix hilariously obvious race
I tried to do a double-checked lock without the double check. Rodrigo Rivas Costa caught the problem and suggested the (obviously correct) fix. https://bugzilla.gnome.org/show_bug.cgi?id=666296
This commit is contained in:
parent
fcc9902e98
commit
11015f1652
@ -611,15 +611,20 @@ g_thread_xp_get_srwlock (GThreadSRWLock * volatile *lock)
|
||||
{
|
||||
EnterCriticalSection (&g_thread_xp_lock);
|
||||
|
||||
result = malloc (sizeof (GThreadSRWLock));
|
||||
|
||||
/* Check again */
|
||||
result = *lock;
|
||||
if (result == NULL)
|
||||
g_thread_abort (errno, "malloc");
|
||||
{
|
||||
result = malloc (sizeof (GThreadSRWLock));
|
||||
|
||||
InitializeCriticalSection (&result->writer_lock);
|
||||
result->writer_locked = FALSE;
|
||||
result->ever_shared = FALSE;
|
||||
*lock = result;
|
||||
if (result == NULL)
|
||||
g_thread_abort (errno, "malloc");
|
||||
|
||||
InitializeCriticalSection (&result->writer_lock);
|
||||
result->writer_locked = FALSE;
|
||||
result->ever_shared = FALSE;
|
||||
*lock = result;
|
||||
}
|
||||
|
||||
LeaveCriticalSection (&g_thread_xp_lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user