[PATCH] device: disconnect signal handlers when modem object removed
Ben Chan
benchan at chromium.org
Mon Feb 13 18:05:00 UTC 2017
thanks. lgtm. The g_signal_handler_is_connected check in clear_modem seems
unnecessary though?
On Mon, Feb 13, 2017 at 6:06 AM, Aleksander Morgado <
aleksander at aleksander.es> wrote:
> Don't rely on the automatic disconnection of the signal as the last
> reference of the modem object may outlive the device object.
>
> Also, setup a common clear_modem() function to dispose the internal
> reference of the modem object, which will take care of the signal
> disconnection when required.
>
> https://lists.freedesktop.org/archives/modemmanager-devel/
> 2017-February/003907.html
> ---
>
> What do you think of this?
>
> ---
> src/mm-device.c | 35 ++++++++++++++++++++++++-----------
> 1 file changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/src/mm-device.c b/src/mm-device.c
> index 6750a0b1..20fb9578 100644
> --- a/src/mm-device.c
> +++ b/src/mm-device.c
> @@ -71,6 +71,7 @@ struct _MMDevicePrivate {
>
> /* The Modem object for this device */
> MMBaseModem *modem;
> + gulong modem_valid_id;
>
> /* When exported, a reference to the object manager */
> GDBusObjectManagerServer *object_manager;
> @@ -293,6 +294,21 @@ export_modem (MMDevice *self)
>
> /***********************************************************
> ******************/
>
> +static void
> +clear_modem (MMDevice *self)
> +{
> + if (self->priv->modem_valid_id) {
> + if (self->priv->modem && g_signal_handler_is_connected
> (self->priv->modem, self->priv->modem_valid_id))
> + g_signal_handler_disconnect (self->priv->modem,
> self->priv->modem_valid_id);
> + self->priv->modem_valid_id = 0;
> + }
> +
> + /* Run dispose before unref-ing, in order to cleanup the SIM object,
> + * if any (which also holds a reference to the modem object) */
> + g_object_run_dispose (G_OBJECT (self->priv->modem));
> + g_clear_object (&(self->priv->modem));
> +}
> +
> void
> mm_device_remove_modem (MMDevice *self)
> {
> @@ -300,11 +316,7 @@ mm_device_remove_modem (MMDevice *self)
> return;
>
> unexport_modem (self);
> -
> - /* Run dispose before unref-ing, in order to cleanup the SIM object,
> - * if any (which also holds a reference to the modem object) */
> - g_object_run_dispose (G_OBJECT (self->priv->modem));
> - g_clear_object (&(self->priv->modem));
> + clear_modem (self);
> g_clear_object (&(self->priv->object_manager));
> }
>
> @@ -391,10 +403,10 @@ mm_device_create_modem (MMDevice
> *self,
> self->priv->object_manager = g_object_ref (object_manager);
>
> /* We want to get notified when the modem becomes valid/invalid */
> - g_signal_connect (self->priv->modem,
> - "notify::" MM_BASE_MODEM_VALID,
> - G_CALLBACK (modem_valid),
> - self);
> + self->priv->modem_valid_id = g_signal_connect (self->priv->modem,
> + "notify::"
> MM_BASE_MODEM_VALID,
> + G_CALLBACK
> (modem_valid),
> + self);
> }
>
> return !!self->priv->modem;
> @@ -582,7 +594,7 @@ set_property (GObject *object,
> self->priv->plugin = g_value_dup_object (value);
> break;
> case PROP_MODEM:
> - g_clear_object (&(self->priv->modem));
> + clear_modem (self);
> self->priv->modem = g_value_dup_object (value);
> break;
> case PROP_HOTPLUGGED:
> @@ -635,7 +647,8 @@ dispose (GObject *object)
> g_clear_object (&(self->priv->plugin));
> g_list_free_full (self->priv->port_probes, (GDestroyNotify)g_object_
> unref);
> g_list_free_full (self->priv->ignored_port_probes,
> (GDestroyNotify)g_object_unref);
> - g_clear_object (&(self->priv->modem));
> +
> + clear_modem (self);
>
> G_OBJECT_CLASS (mm_device_parent_class)->dispose (object);
> }
> --
> 2.11.1
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20170213/2c6c157c/attachment-0001.html>
More information about the ModemManager-devel
mailing list