aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-02-20 19:06:16 +0100
committerAleksander Morgado <aleksander@lanedo.com>2013-02-20 19:16:05 +0100
commit0377ccaa59c46dc8536b753cc8b9de17a0f19790 (patch)
tree6c77c1a928e7abb52fa01fcc67f27e5dcce0c8d2
parent5b072b9198aba83ba4cd69f4310d431682c8ee67 (diff)
manager: during initial scan, add new ports in idles
Treat each port independently in its own idle, as if we're receiving independent udev events, otherwise, GSources may not be properly scheduled in the main loop.
-rw-r--r--src/mm-manager.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c
index 688348f9..edb6f294 100644
--- a/src/mm-manager.c
+++ b/src/mm-manager.c
@@ -400,6 +400,33 @@ handle_uevent (GUdevClient *client,
device_removed (self, device);
}
+typedef struct {
+ MMManager *self;
+ GUdevDevice *device;
+} StartDeviceAdded;
+
+static gboolean
+start_device_added_idle (StartDeviceAdded *ctx)
+{
+ device_added (ctx->self, ctx->device, FALSE);
+ g_object_unref (ctx->self);
+ g_object_unref (ctx->device);
+ g_slice_free (StartDeviceAdded, ctx);
+ return FALSE;
+}
+
+static void
+start_device_added (MMManager *self,
+ GUdevDevice *device)
+{
+ StartDeviceAdded *ctx;
+
+ ctx = g_slice_new (StartDeviceAdded);
+ ctx->self = g_object_ref (self);
+ ctx->device = g_object_ref (device);
+ g_idle_add ((GSourceFunc)start_device_added_idle, ctx);
+}
+
void
mm_manager_start (MMManager *manager)
{
@@ -412,14 +439,14 @@ mm_manager_start (MMManager *manager)
devices = g_udev_client_query_by_subsystem (manager->priv->udev, "tty");
for (iter = devices; iter; iter = g_list_next (iter)) {
- device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
+ start_device_added (manager, G_UDEV_DEVICE (iter->data));
g_object_unref (G_OBJECT (iter->data));
}
g_list_free (devices);
devices = g_udev_client_query_by_subsystem (manager->priv->udev, "net");
for (iter = devices; iter; iter = g_list_next (iter)) {
- device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
+ start_device_added (manager, G_UDEV_DEVICE (iter->data));
g_object_unref (G_OBJECT (iter->data));
}
g_list_free (devices);
@@ -430,7 +457,7 @@ mm_manager_start (MMManager *manager)
name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data));
if (name && g_str_has_prefix (name, "cdc-wdm"))
- device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
+ start_device_added (manager, G_UDEV_DEVICE (iter->data));
g_object_unref (G_OBJECT (iter->data));
}
g_list_free (devices);
@@ -442,7 +469,7 @@ mm_manager_start (MMManager *manager)
name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data));
if (name && g_str_has_prefix (name, "cdc-wdm"))
- device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
+ start_device_added (manager, G_UDEV_DEVICE (iter->data));
g_object_unref (G_OBJECT (iter->data));
}
g_list_free (devices);