From 11015f165229ac3cb5f008a8824f8135ec45c89a Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Thu, 15 Dec 2011 13:27:27 -0500 Subject: [PATCH] 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 --- glib/gthread-win32.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c index dd777c2de..29065b55b 100644 --- a/glib/gthread-win32.c +++ b/glib/gthread-win32.c @@ -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); }