summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2012-09-26 09:45:46 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2012-10-05 17:36:06 +0100
commit0da0e5122e7526ada688beef22684bb0ed54a367 (patch)
tree535fce6031620dfdcbfab0d6bdbd1bfe96789f22
parentbacda24534e6734aa5f1d364642fbab321efc632 (diff)
downloadclutter-0da0e5122e7526ada688beef22684bb0ed54a367.tar.gz
main: Do not release the lock if it hasn't been acquired
On various systems, trying to release a mutex that hasn't been acquired will result in a run-time error. In order to avoid this, we trylock() the Big Clutter Lock™ and immediately unlock() it, regardless of the result; if the lock was already acquired, trylock() will immediately fail, and we can release it; if the lock was not acquired, trylock() will succeed, and we can release the lock immediately. This is necessary to maintain binary compatibility and invariants for Clutter applications doing: clutter_init() clutter_threads_enter() ... clutter_main() ... clutter_threads_leave() instead of the correct: clutter_init() clutter_threads_enter() ... clutter_threads_leave() clutter_main() clutter_threads_enter() ... clutter_threads_leave() With Clutter ≥ 1.12, the idiomatic form is: clutter_init() ... clutter_main() given that the public Big Clutter Lock™ acquire/release API has been deprecated, and nobody should take the lock outside of Clutter itself. https://bugzilla.gnome.org/show_bug.cgi?id=679439
-rw-r--r--clutter/clutter-main.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index 7e8fe952d..089dc5af3 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -226,6 +226,16 @@ clutter_threads_impl_lock (void)
static void
clutter_threads_impl_unlock (void)
{
+ /* we need to trylock here, in case the lock hasn't been acquired; on
+ * various systems trying to release a mutex that hasn't been acquired
+ * will cause a run-time error. trylock() will either fail, in which
+ * case we can release the lock we own; or it will succeeds, in which
+ * case we need to release the lock we just acquired. so we ignore the
+ * returned value.
+ *
+ * see: https://bugs.gnome.org/679439
+ */
+ g_mutex_trylock (&clutter_threads_mutex);
g_mutex_unlock (&clutter_threads_mutex);
}