GtkSearchEngine: Avoid a crash

Add a destroy notify for the data of the callback, so we don't
end up leaving a dangling pointer behind for a short while if
the native engine is finalized before the simple one. This
was showing up as crash when typing and backspacing in the
search entry of the file chooser.
This commit is contained in:
Matthias Clasen 2015-06-19 00:32:49 -04:00
parent d12c7186b6
commit ed50772b41
3 changed files with 18 additions and 3 deletions

View File

@ -334,7 +334,8 @@ _gtk_search_engine_new (void)
connect_engine_signals (engine->priv->native, engine);
_gtk_search_engine_simple_set_indexed_cb (GTK_SEARCH_ENGINE_SIMPLE (engine->priv->simple),
_gtk_search_engine_tracker_is_indexed,
engine->priv->native);
g_object_ref (engine->priv->native),
g_object_unref);
}
#endif

View File

@ -57,6 +57,7 @@ struct _GtkSearchEngineSimplePrivate
GtkSearchEngineSimpleIsIndexed is_indexed_callback;
gpointer is_indexed_data;
GDestroyNotify is_indexed_data_destroy;
};
@ -83,6 +84,13 @@ gtk_search_engine_simple_dispose (GObject *object)
priv->active_search = NULL;
}
if (priv->is_indexed_data_destroy)
priv->is_indexed_data_destroy (priv->is_indexed_data);
priv->is_indexed_callback = NULL;
priv->is_indexed_data = NULL;
priv->is_indexed_data_destroy = NULL;
G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->dispose (object);
}
@ -365,8 +373,13 @@ _gtk_search_engine_simple_new (void)
void
_gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
GtkSearchEngineSimpleIsIndexed callback,
gpointer data)
gpointer data,
GDestroyNotify destroy)
{
if (engine->priv->is_indexed_data_destroy)
engine->priv->is_indexed_data_destroy (engine->priv->is_indexed_data);
engine->priv->is_indexed_callback = callback;
engine->priv->is_indexed_data = data;
engine->priv->is_indexed_data_destroy = destroy;
}

View File

@ -57,7 +57,8 @@ typedef gboolean (*GtkSearchEngineSimpleIsIndexed) (GFile *location, gpointer da
void _gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
GtkSearchEngineSimpleIsIndexed callback,
gpointer data);
gpointer data,
GDestroyNotify destroy);
G_END_DECLS