From 0da0e5122e7526ada688beef22684bb0ed54a367 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 26 Sep 2012 09:45:46 +0100 Subject: main: Do not release the lock if it hasn't been acquired MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- clutter/clutter-main.c | 10 ++++++++++ 1 file changed, 10 insertions(+) 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); } -- cgit v1.2.1