diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-manager.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index e662d9fb..58cea119 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -218,11 +218,22 @@ device_removed (MMBaseManager *self, /* If port probe list gets empty, remove the device object iself */ if (!mm_device_peek_port_probe_list (device)) { + /* The callback triggered when the device support is cancelled may end up + * removing the device from the HT, and that was the last full reference + * we kept. So, in order to make sure the reference is still valid after + * support_check_cancel(), we hold a full reference ourselves. */ mm_dbg ("Removing empty device '%s'", mm_device_get_uid (device)); - if (mm_plugin_manager_device_support_check_cancel (self->priv->plugin_manager, device)) - mm_dbg ("Device support check has been cancelled"); - mm_device_remove_modem (device); - g_hash_table_remove (self->priv->devices, mm_device_get_uid (device)); + g_object_ref (device); + { + if (mm_plugin_manager_device_support_check_cancel (self->priv->plugin_manager, device)) + mm_dbg ("Device support check has been cancelled"); + + /* The device may have already been removed from the tracking HT, we + * just try to remove it and if it fails, we ignore it */ + mm_device_remove_modem (device); + g_hash_table_remove (self->priv->devices, mm_device_get_uid (device)); + } + g_object_unref (device); } } |