diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-01 23:47:57 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-16 14:53:20 +0100 |
commit | 52ff02323d07d4b27755f7ad49bef5ee53e27109 (patch) | |
tree | 53d1f5db5a6701b6fd62eaba1106740138d2f996 | |
parent | f8f09692894dc30e6bfd019554783b7a18de61a2 (diff) |
plugin-manager: avoid race when port deferred until suggested and suggestion already there
It may happen that we launch the supports task in the port AFTER having received
the suggestion.
-rw-r--r-- | src/mm-plugin-manager.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/mm-plugin-manager.c b/src/mm-plugin-manager.c index 16e1e786..175762e7 100644 --- a/src/mm-plugin-manager.c +++ b/src/mm-plugin-manager.c @@ -331,12 +331,24 @@ supports_port_ready_cb (MMPlugin *plugin, break; case MM_PLUGIN_SUPPORTS_PORT_DEFER_UNTIL_SUGGESTED: - /* We are deferred until a suggested plugin is given. If last supports task - * of a given device is finished without finding a best plugin, this task - * will get finished reporting unsupported. */ - mm_dbg ("(%s) deferring support check until result suggested", - info->name); - info->defer_until_suggested = TRUE; + /* If we arrived here and we already have a plugin suggested, use it */ + if (info->suggested_plugin) { + mm_dbg ("(%s): (%s) task completed, got suggested plugin", + mm_plugin_get_name (info->suggested_plugin), + info->name); + /* Schedule checking support, which will end the operation */ + info->best_plugin = info->suggested_plugin; + info->current = NULL; + info->source_id = g_idle_add ((GSourceFunc)find_port_support_idle, + info); + } else { + /* We are deferred until a suggested plugin is given. If last supports task + * of a given device is finished without finding a best plugin, this task + * will get finished reporting unsupported. */ + mm_dbg ("(%s) deferring support check until result suggested", + info->name); + info->defer_until_suggested = TRUE; + } break; } } |