diff options
Diffstat (limited to 'src/libebackend/e-data-factory.c')
-rw-r--r-- | src/libebackend/e-data-factory.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/libebackend/e-data-factory.c b/src/libebackend/e-data-factory.c index 7c4106a68..63b3ccf9b 100644 --- a/src/libebackend/e-data-factory.c +++ b/src/libebackend/e-data-factory.c @@ -188,18 +188,31 @@ data_factory_subprocess_helper_free (DataFactorySubprocessHelper *helper) } } +static void +data_factory_backend_toggle_notify_cb (gpointer user_data, + GObject *backend, + gboolean is_last_ref); + typedef struct _OpenedBackendData { + EDataFactory *data_factory; EBackend *backend; gchar *object_path; } OpenedBackendData; static OpenedBackendData * -opened_backend_data_new (EBackend *backend, /* assumes ownership of 'backend' */ +opened_backend_data_new (EDataFactory *data_factory, + EBackend *backend, /* assumes ownership of 'backend' */ const gchar *object_path) { OpenedBackendData *obd; + g_object_add_toggle_ref ( + G_OBJECT (backend), + data_factory_backend_toggle_notify_cb, + data_factory); + obd = g_slice_new0 (OpenedBackendData); + obd->data_factory = data_factory; obd->backend = backend; obd->object_path = g_strdup (object_path); @@ -212,6 +225,9 @@ opened_backend_data_free (gpointer ptr) OpenedBackendData *obd = ptr; if (obd) { + if (obd->backend) + g_object_remove_toggle_ref (G_OBJECT (obd->backend), data_factory_backend_toggle_notify_cb, obd->data_factory); + g_clear_object (&obd->backend); g_free (obd->object_path); g_slice_free (OpenedBackendData, obd); @@ -1347,9 +1363,6 @@ data_factory_backend_toggle_notify_cb (gpointer user_data, g_object_ref (backend); - g_object_remove_toggle_ref ( - backend, data_factory_backend_toggle_notify_cb, user_data); - g_signal_emit_by_name (backend, "shutdown"); g_mutex_lock (&data_factory->priv->mutex); @@ -1465,14 +1478,9 @@ data_factory_spawn_subprocess_backend (EDataFactory *data_factory, backend = e_data_factory_create_backend (data_factory, backend_factory, source); object_path = e_data_factory_open_backend (data_factory, backend, g_dbus_method_invocation_get_connection (invocation), NULL, &error); if (object_path) { - g_object_add_toggle_ref ( - G_OBJECT (backend), - data_factory_backend_toggle_notify_cb, - data_factory); - g_mutex_lock (&data_factory->priv->mutex); g_hash_table_insert (data_factory->priv->opened_backends, backend_key, - opened_backend_data_new (backend, object_path)); + opened_backend_data_new (data_factory, backend, object_path)); g_mutex_unlock (&data_factory->priv->mutex); backend_key = NULL; |