mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +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);
|
EnterCriticalSection (&g_thread_xp_lock);
|
||||||
|
|
||||||
result = malloc (sizeof (GThreadSRWLock));
|
/* Check again */
|
||||||
|
result = *lock;
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
g_thread_abort (errno, "malloc");
|
{
|
||||||
|
result = malloc (sizeof (GThreadSRWLock));
|
||||||
|
|
||||||
InitializeCriticalSection (&result->writer_lock);
|
if (result == NULL)
|
||||||
result->writer_locked = FALSE;
|
g_thread_abort (errno, "malloc");
|
||||||
result->ever_shared = FALSE;
|
|
||||||
*lock = result;
|
InitializeCriticalSection (&result->writer_lock);
|
||||||
|
result->writer_locked = FALSE;
|
||||||
|
result->ever_shared = FALSE;
|
||||||
|
*lock = result;
|
||||||
|
}
|
||||||
|
|
||||||
LeaveCriticalSection (&g_thread_xp_lock);
|
LeaveCriticalSection (&g_thread_xp_lock);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user