aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-manager.c19
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);
}
}