summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2011-10-18 23:26:00 -0400
committerRyan Lortie <desrt@desrt.ca>2011-10-18 23:26:00 -0400
commit99f0eaa4c5a86f6fa721044bb6841f6bda4c689b (patch)
treee897beb4c3beb60f47ffed63b5d79141ce413ce0
parentaba0f0c38bbfa11ad48b5410ebdbed2a99e68c58 (diff)
Fix bug in g_static_rec_mutex_unlock_full()
pthreads doesn't implement the _lock_full() and _unlock_full() calls on recursive mutexes so we don't have it on GRecMutex either. Now that we're using GRecMutex to implement GStaticRecMutex, we have to fake it by keeping an internal counter of the number of locks and calling g_rec_mutex_unlock() the appropriate number of times. The code to do this looked like: depth = mutex->depth; while (mutex->depth--) g_rec_mutex_unlock (rm); return depth; which unfortunately did one last decrement after mutex->depth was already zero (leaving it equal to -1). When locked the next time, the count would then increase from -1 to 0 and then the next _unlock_full() call would not do any calls to g_rec_mutex_unlock(), leading to a deadlock. https://bugzilla.gnome.org/show_bug.cgi?id=661914
-rw-r--r--glib/deprecated/gthread-deprecated.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/glib/deprecated/gthread-deprecated.c b/glib/deprecated/gthread-deprecated.c
index cb685e309..b53dfce6e 100644
--- a/glib/deprecated/gthread-deprecated.c
+++ b/glib/deprecated/gthread-deprecated.c
@@ -806,8 +806,11 @@ g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex)
rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
depth = mutex->depth;
- while (mutex->depth--)
- g_rec_mutex_unlock (rm);
+ while (mutex->depth)
+ {
+ mutex->depth--;
+ g_rec_mutex_unlock (rm);
+ }
return depth;
}