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:
Ryan Lortie 2011-12-15 13:27:27 -05:00
parent fcc9902e98
commit 11015f1652

View File

@ -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);
} }