Patch by Sebastian Wilhemi to fix infinite recursion in g_atomic.

This commit is contained in:
Matthias Clasen 2004-03-05 21:10:45 +00:00
parent eba3e00280
commit ab0031bf00
9 changed files with 85 additions and 14 deletions

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -1,3 +1,13 @@
2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gatomic.c: Fix infinite recursion for
G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
instead of G_DEFINE_LOCK. The mutex is allocated by the new
function _g_atomic_thread_init. Fixes #136284.
* glib/gthreadinit.h, glib/gthread.c: Declare and call
_g_atomic_thread_init during thread system initialization.
2004-03-05 Tor Lillqvist <tml@iki.fi> 2004-03-05 Tor Lillqvist <tml@iki.fi>
* glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)

View File

@ -466,17 +466,18 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
#ifdef DEFINE_WITH_MUTEXES #ifdef DEFINE_WITH_MUTEXES
/* We have to use the slow, but safe locking method */ /* We have to use the slow, but safe locking method */
G_LOCK_DEFINE_STATIC (g_atomic_lock); static GMutex *g_atomic_mutex;
gint gint
g_atomic_int_exchange_and_add (gint *atomic, g_atomic_int_exchange_and_add (gint *atomic,
gint val) gint val)
{ {
gint result; gint result;
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
result = *atomic; result = *atomic;
*atomic += val; *atomic += val;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
return result; return result;
} }
@ -486,9 +487,9 @@ void
g_atomic_int_add (gint *atomic, g_atomic_int_add (gint *atomic,
gint val) gint val)
{ {
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
*atomic += val; *atomic += val;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
} }
gboolean gboolean
@ -498,7 +499,7 @@ g_atomic_int_compare_and_exchange (gint *atomic,
{ {
gboolean result; gboolean result;
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
if (*atomic == oldval) if (*atomic == oldval)
{ {
result = TRUE; result = TRUE;
@ -506,7 +507,7 @@ g_atomic_int_compare_and_exchange (gint *atomic,
} }
else else
result = FALSE; result = FALSE;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
return result; return result;
} }
@ -518,7 +519,7 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
{ {
gboolean result; gboolean result;
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
if (*atomic == oldval) if (*atomic == oldval)
{ {
result = TRUE; result = TRUE;
@ -526,7 +527,7 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
} }
else else
result = FALSE; result = FALSE;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
return result; return result;
} }
@ -537,9 +538,9 @@ g_atomic_int_get (gint *atomic)
{ {
gint result; gint result;
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
result = *atomic; result = *atomic;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
return result; return result;
} }
@ -549,9 +550,9 @@ g_atomic_pointer_get (gpointer *atomic)
{ {
gpointer result; gpointer result;
G_LOCK (g_atomic_lock); g_mutex_lock (g_atomic_mutex);
result = *atomic; result = *atomic;
G_UNLOCK (g_atomic_lock); g_mutex_unlock (g_atomic_mutex);
return result; return result;
} }
@ -609,3 +610,11 @@ g_atomic_int_add (gint *atomic,
while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val)); while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val));
} }
#endif /* ATOMIC_INT_CMP_XCHG */ #endif /* ATOMIC_INT_CMP_XCHG */
void
_g_atomic_thread_init ()
{
#ifdef DEFINE_WITH_MUTEXES
g_atomic_mutex = g_mutex_new ();
#endif /* DEFINE_WITH_MUTEXES */
}

View File

@ -153,7 +153,8 @@ g_thread_init_glib (void)
_g_main_thread_init (); _g_main_thread_init ();
_g_mem_thread_init (); _g_mem_thread_init ();
_g_messages_thread_init (); _g_messages_thread_init ();
_g_atomic_thread_init ();
g_threads_got_initialized = TRUE; g_threads_got_initialized = TRUE;
g_thread_specific_private = g_private_new (g_thread_cleanup); g_thread_specific_private = g_private_new (g_thread_cleanup);

View File

@ -32,6 +32,7 @@ void _g_messages_thread_init (void);
void _g_convert_thread_init (void); void _g_convert_thread_init (void);
void _g_rand_thread_init (void); void _g_rand_thread_init (void);
void _g_main_thread_init (void); void _g_main_thread_init (void);
void _g_atomic_thread_init (void);
/* Are called from glib/gthread.c. Must only contain g_private_new calls */ /* Are called from glib/gthread.c. Must only contain g_private_new calls */
void _g_mem_thread_private_init (void); void _g_mem_thread_private_init (void);