diff --git a/src/server/pv-client-source.c b/src/server/pv-client-source.c index 10b21b7f7..c3bd49048 100644 --- a/src/server/pv-client-source.c +++ b/src/server/pv-client-source.c @@ -231,11 +231,21 @@ client_release_source_output (PvSource *source, PvSourceOutput *output) } static void -client_source_finalize (GObject * object) +client_source_dispose (GObject * object) { PvClientSourcePrivate *priv = PV_CLIENT_SOURCE (object)->priv; gst_element_set_state (priv->pipeline, GST_STATE_NULL); + + G_OBJECT_CLASS (pv_client_source_parent_class)->dispose (object); +} + +static void +client_source_finalize (GObject * object) +{ + PvClientSourcePrivate *priv = PV_CLIENT_SOURCE (object)->priv; + + g_clear_object (&priv->input); g_clear_object (&priv->filter); g_clear_object (&priv->sink); g_clear_object (&priv->src); @@ -305,7 +315,7 @@ pv_client_source_get_source_input (PvClientSource *source, g_signal_connect (priv->input, "notify::socket", (GCallback) on_input_socket_notify, source); } - return priv->input; + return g_object_ref (priv->input); } static void @@ -316,6 +326,7 @@ pv_client_source_class_init (PvClientSourceClass * klass) g_type_class_add_private (klass, sizeof (PvClientSourcePrivate)); + gobject_class->dispose = client_source_dispose; gobject_class->finalize = client_source_finalize; source_class->get_formats = client_get_formats; diff --git a/src/server/pv-client.c b/src/server/pv-client.c index 4215c05f7..46e84bb7d 100644 --- a/src/server/pv-client.c +++ b/src/server/pv-client.c @@ -254,9 +254,9 @@ handle_create_source_input (PvClient1 *interface, g_signal_connect (input, "remove", (GCallback) handle_remove_source_output, - client); + source); - g_object_set_data_full (G_OBJECT (client), + g_object_set_data_full (G_OBJECT (source), source_input_path, input, g_object_unref); @@ -343,14 +343,21 @@ client_unregister_object (PvClient *client) g_free (priv->object_path); } +static void +pv_client_dispose (GObject * object) +{ + PvClient *client = PV_CLIENT (object); + + client_unregister_object (client); + + G_OBJECT_CLASS (pv_client_parent_class)->dispose (object); +} static void pv_client_finalize (GObject * object) { PvClient *client = PV_CLIENT (object); PvClientPrivate *priv = client->priv; - client_unregister_object (client); - if (priv->properties) g_variant_unref (priv->properties); @@ -375,10 +382,11 @@ pv_client_class_init (PvClientClass * klass) g_type_class_add_private (klass, sizeof (PvClientPrivate)); + gobject_class->constructed = pv_client_constructed; + gobject_class->dispose = pv_client_dispose; gobject_class->finalize = pv_client_finalize; gobject_class->set_property = pv_client_set_property; gobject_class->get_property = pv_client_get_property; - gobject_class->constructed = pv_client_constructed; g_object_class_install_property (gobject_class, PROP_DAEMON, diff --git a/src/server/pv-daemon.c b/src/server/pv-daemon.c index ed160d177..a194983d9 100644 --- a/src/server/pv-daemon.c +++ b/src/server/pv-daemon.c @@ -382,13 +382,22 @@ pv_daemon_find_source (PvDaemon *daemon, G_DEFINE_TYPE (PvDaemon, pv_daemon, G_TYPE_OBJECT); +static void +pv_daemon_dispose (GObject * object) +{ + PvDaemon *daemon = PV_DAEMON_CAST (object); + + pv_daemon_stop (daemon); + + G_OBJECT_CLASS (pv_daemon_parent_class)->dispose (object); +} + static void pv_daemon_finalize (GObject * object) { PvDaemon *daemon = PV_DAEMON_CAST (object); PvDaemonPrivate *priv = daemon->priv; - pv_daemon_stop (daemon); g_clear_object (&priv->server_manager); G_OBJECT_CLASS (pv_daemon_parent_class)->finalize (object); @@ -401,6 +410,7 @@ pv_daemon_class_init (PvDaemonClass * klass) g_type_class_add_private (klass, sizeof (PvDaemonPrivate)); + gobject_class->dispose = pv_daemon_dispose; gobject_class->finalize = pv_daemon_finalize; } diff --git a/src/server/pv-source-output.c b/src/server/pv-source-output.c index 52a47693a..5061a2ccb 100644 --- a/src/server/pv-source-output.c +++ b/src/server/pv-source-output.c @@ -211,15 +211,24 @@ no_format: } } +static void +clear_socket (PvSourceOutput *output) +{ + PvSourceOutputPrivate *priv = output->priv; + + g_clear_object (&priv->socket); + g_clear_pointer (&priv->requested_format, g_bytes_unref); + g_clear_pointer (&priv->format, g_bytes_unref); +} + + static void stop_transfer (PvSourceOutput *output) { PvSourceOutputPrivate *priv = output->priv; if (priv->socket) { - g_clear_object (&priv->socket); - g_clear_pointer (&priv->requested_format, g_bytes_unref); - g_clear_pointer (&priv->format, g_bytes_unref); + clear_socket (output); g_object_notify (G_OBJECT (output), "socket"); } } @@ -276,8 +285,6 @@ output_unregister_object (PvSourceOutput *output) { PvSourceOutputPrivate *priv = output->priv; - stop_transfer (output); - pv_daemon_unexport (priv->daemon, priv->object_path); } @@ -286,6 +293,7 @@ pv_source_output_dispose (GObject * object) { PvSourceOutput *output = PV_SOURCE_OUTPUT (object); + clear_socket (output); output_unregister_object (output); G_OBJECT_CLASS (pv_source_output_parent_class)->dispose (object); @@ -324,11 +332,11 @@ pv_source_output_class_init (PvSourceOutputClass * klass) g_type_class_add_private (klass, sizeof (PvSourceOutputPrivate)); + gobject_class->constructed = pv_source_output_constructed; gobject_class->dispose = pv_source_output_dispose; gobject_class->finalize = pv_source_output_finalize; gobject_class->set_property = pv_source_output_set_property; gobject_class->get_property = pv_source_output_get_property; - gobject_class->constructed = pv_source_output_constructed; g_object_class_install_property (gobject_class, PROP_DAEMON, diff --git a/src/server/pv-source.c b/src/server/pv-source.c index 8863430fc..01471be5e 100644 --- a/src/server/pv-source.c +++ b/src/server/pv-source.c @@ -171,14 +171,22 @@ pv_source_constructed (GObject * object) G_OBJECT_CLASS (pv_source_parent_class)->constructed (object); } +static void +pv_source_dispose (GObject * object) +{ + PvSource *source = PV_SOURCE (object); + + source_unregister_object (source); + + G_OBJECT_CLASS (pv_source_parent_class)->dispose (object); +} + static void pv_source_finalize (GObject * object) { PvSource *source = PV_SOURCE (object); PvSourcePrivate *priv = source->priv; - source_unregister_object (source); - g_free (priv->object_path); g_free (priv->name); if (priv->properties) @@ -239,8 +247,9 @@ pv_source_class_init (PvSourceClass * klass) g_type_class_add_private (klass, sizeof (PvSourcePrivate)); - gobject_class->finalize = pv_source_finalize; gobject_class->constructed = pv_source_constructed; + gobject_class->dispose = pv_source_dispose; + gobject_class->finalize = pv_source_finalize; gobject_class->set_property = pv_source_set_property; gobject_class->get_property = pv_source_get_property;