diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2012-09-26 09:45:46 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2012-10-05 17:36:06 +0100 |
commit | 0da0e5122e7526ada688beef22684bb0ed54a367 (patch) | |
tree | 535fce6031620dfdcbfab0d6bdbd1bfe96789f22 | |
parent | bacda24534e6734aa5f1d364642fbab321efc632 (diff) | |
download | clutter-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.c | 10 |
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); } |