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
This commit is contained in:
parent
bacda24534
commit
0da0e5122e
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user