mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-16 07:04:29 +00:00
icon-theme: Fix deadlock in GktIconTheme dispose
When freeing the display GtkIconTheme and that was the last owner we ran into a deadlock, because we unref the "next-to-last" ref inside a gtk_icon_theme_ref_aquire/release() pair, which makes the final unref to happen in the release(), while the ref lock still was held. The unref triggers dispose which tries to NULL out the ref, but that then deadlocks on the mutex being held by the caller already. We fix this by moving the release unref outside the lock. This is safe because refcounts are atomic, and we *do* own the ref.
This commit is contained in:
parent
e026a04e03
commit
e75bc2833d
@ -549,9 +549,16 @@ gtk_icon_theme_ref_aquire (GtkIconThemeRef *ref)
|
||||
static void
|
||||
gtk_icon_theme_ref_release (GtkIconThemeRef *ref)
|
||||
{
|
||||
if (ref->theme)
|
||||
g_object_unref (ref->theme);
|
||||
GtkIconTheme *theme;
|
||||
|
||||
/* Get a pointer to the theme, becuse when we unlock it could become NULLed by dispose, this pointer still owns a ref */
|
||||
theme = ref->theme;
|
||||
g_mutex_unlock (&ref->lock);
|
||||
|
||||
/* Then unref outside the lock, because otherwis if this is the last ref the dispose handler would deadlock trying to NULL ref->theme */
|
||||
if (theme)
|
||||
g_object_unref (theme);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user