From 0377ccaa59c46dc8536b753cc8b9de17a0f19790 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 20 Feb 2013 19:06:16 +0100 Subject: 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. --- src/mm-manager.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'src') 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); -- cgit v1.2.3-70-g09d2