mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-17 13:12:43 +00:00
Move the device add delay to shared code
This allows us to reuse the logic in other plugins.
This commit is contained in:
parent
74702297b2
commit
ae3d65f60b
@ -27,7 +27,9 @@
|
|||||||
#include "fu-plugin-vfuncs.h"
|
#include "fu-plugin-vfuncs.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fu_plugin_usb_device_added (FuPlugin *plugin, GUsbDevice *device)
|
fu_plugin_usb_device_added_cb (GUsbContext *ctx,
|
||||||
|
GUsbDevice *device,
|
||||||
|
FuPlugin *plugin)
|
||||||
{
|
{
|
||||||
const gchar *platform_id = NULL;
|
const gchar *platform_id = NULL;
|
||||||
guint8 idx = 0x00;
|
guint8 idx = 0x00;
|
||||||
@ -120,40 +122,12 @@ fu_plugin_usb_device_added (FuPlugin *plugin, GUsbDevice *device)
|
|||||||
if (!g_usb_device_close (device, &error))
|
if (!g_usb_device_close (device, &error))
|
||||||
g_debug ("Failed to close: %s", error->message);
|
g_debug ("Failed to close: %s", error->message);
|
||||||
|
|
||||||
/* insert to hash */
|
|
||||||
fu_plugin_device_add (plugin, dev);
|
|
||||||
fu_plugin_cache_add (plugin, platform_id, dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
FuPlugin *plugin;
|
|
||||||
GUsbDevice *device;
|
|
||||||
} FuPluginHelper;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
fu_plugin_usb_device_added_delay_cb (gpointer user_data)
|
|
||||||
{
|
|
||||||
FuPluginHelper *helper = (FuPluginHelper *) user_data;
|
|
||||||
fu_plugin_usb_device_added (helper->plugin, helper->device);
|
|
||||||
g_object_unref (helper->plugin);
|
|
||||||
g_object_unref (helper->device);
|
|
||||||
g_free (helper);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fu_plugin_usb_device_added_cb (GUsbContext *ctx,
|
|
||||||
GUsbDevice *device,
|
|
||||||
FuPlugin *plugin)
|
|
||||||
{
|
|
||||||
/* use a small delay for hotplugging so that other, better, plugins
|
/* use a small delay for hotplugging so that other, better, plugins
|
||||||
* can claim this interface and add the FuDevice */
|
* can claim this interface and add the FuDevice */
|
||||||
FuPluginHelper *helper;
|
fu_plugin_device_add_delay (plugin, dev);
|
||||||
g_debug ("waiting a small time for other plugins");
|
|
||||||
helper = g_new0 (FuPluginHelper, 1);
|
/* insert to hash */
|
||||||
helper->plugin = g_object_ref (plugin);
|
fu_plugin_cache_add (plugin, platform_id, dev);
|
||||||
helper->device = g_object_ref (device);
|
|
||||||
g_timeout_add (500, fu_plugin_usb_device_added_delay_cb, helper);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -39,6 +39,7 @@ typedef struct {
|
|||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GHashTable *devices; /* platform_id:GObject */
|
GHashTable *devices; /* platform_id:GObject */
|
||||||
|
GHashTable *devices_delay; /* FuDevice:FuPluginHelper */
|
||||||
FuPluginData *data;
|
FuPluginData *data;
|
||||||
} FuPluginPrivate;
|
} FuPluginPrivate;
|
||||||
|
|
||||||
@ -196,9 +197,57 @@ fu_plugin_device_add (FuPlugin *plugin, FuDevice *device)
|
|||||||
g_signal_emit (plugin, signals[SIGNAL_DEVICE_ADDED], 0, device);
|
g_signal_emit (plugin, signals[SIGNAL_DEVICE_ADDED], 0, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FuPlugin *plugin;
|
||||||
|
FuDevice *device;
|
||||||
|
guint timeout_id;
|
||||||
|
} FuPluginHelper;
|
||||||
|
|
||||||
|
static void
|
||||||
|
fu_plugin_helper_free (FuPluginHelper *helper)
|
||||||
|
{
|
||||||
|
g_object_unref (helper->plugin);
|
||||||
|
g_object_unref (helper->device);
|
||||||
|
g_free (helper);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
fu_plugin_device_add_delay_cb (gpointer user_data)
|
||||||
|
{
|
||||||
|
FuPluginHelper *helper = (FuPluginHelper *) user_data;
|
||||||
|
fu_plugin_device_add (helper->plugin, helper->device);
|
||||||
|
fu_plugin_helper_free (helper);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fu_plugin_device_add_delay (FuPlugin *plugin, FuDevice *device)
|
||||||
|
{
|
||||||
|
FuPluginPrivate *priv = GET_PRIVATE (plugin);
|
||||||
|
FuPluginHelper *helper;
|
||||||
|
g_debug ("waiting a small time for other plugins");
|
||||||
|
helper = g_new0 (FuPluginHelper, 1);
|
||||||
|
helper->plugin = g_object_ref (plugin);
|
||||||
|
helper->device = g_object_ref (device);
|
||||||
|
helper->timeout_id = g_timeout_add (500, fu_plugin_device_add_delay_cb, helper);
|
||||||
|
g_hash_table_insert (priv->devices_delay, device, helper);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fu_plugin_device_remove (FuPlugin *plugin, FuDevice *device)
|
fu_plugin_device_remove (FuPlugin *plugin, FuDevice *device)
|
||||||
{
|
{
|
||||||
|
FuPluginPrivate *priv = GET_PRIVATE (plugin);
|
||||||
|
FuPluginHelper *helper;
|
||||||
|
|
||||||
|
/* waiting for add */
|
||||||
|
helper = g_hash_table_lookup (priv->devices_delay, device);
|
||||||
|
if (helper != NULL) {
|
||||||
|
g_debug ("ignoring remove from delayed addition");
|
||||||
|
g_source_remove (helper->timeout_id);
|
||||||
|
fu_plugin_helper_free (helper);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
g_debug ("emit removed from %s: %s",
|
g_debug ("emit removed from %s: %s",
|
||||||
fu_plugin_get_name (plugin),
|
fu_plugin_get_name (plugin),
|
||||||
fu_device_get_id (device));
|
fu_device_get_id (device));
|
||||||
@ -706,6 +755,7 @@ fu_plugin_init (FuPlugin *plugin)
|
|||||||
priv->enabled = TRUE;
|
priv->enabled = TRUE;
|
||||||
priv->devices = g_hash_table_new_full (g_str_hash, g_str_equal,
|
priv->devices = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free, (GDestroyNotify) g_object_unref);
|
g_free, (GDestroyNotify) g_object_unref);
|
||||||
|
priv->devices_delay = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -729,6 +779,7 @@ fu_plugin_finalize (GObject *object)
|
|||||||
if (priv->module != NULL)
|
if (priv->module != NULL)
|
||||||
g_module_close (priv->module);
|
g_module_close (priv->module);
|
||||||
g_hash_table_unref (priv->devices);
|
g_hash_table_unref (priv->devices);
|
||||||
|
g_hash_table_unref (priv->devices_delay);
|
||||||
g_free (priv->name);
|
g_free (priv->name);
|
||||||
g_free (priv->data);
|
g_free (priv->data);
|
||||||
|
|
||||||
|
@ -69,6 +69,8 @@ void fu_plugin_set_enabled (FuPlugin *plugin,
|
|||||||
GUsbContext *fu_plugin_get_usb_context (FuPlugin *plugin);
|
GUsbContext *fu_plugin_get_usb_context (FuPlugin *plugin);
|
||||||
void fu_plugin_device_add (FuPlugin *plugin,
|
void fu_plugin_device_add (FuPlugin *plugin,
|
||||||
FuDevice *device);
|
FuDevice *device);
|
||||||
|
void fu_plugin_device_add_delay (FuPlugin *plugin,
|
||||||
|
FuDevice *device);
|
||||||
void fu_plugin_device_remove (FuPlugin *plugin,
|
void fu_plugin_device_remove (FuPlugin *plugin,
|
||||||
FuDevice *device);
|
FuDevice *device);
|
||||||
void fu_plugin_set_status (FuPlugin *plugin,
|
void fu_plugin_set_status (FuPlugin *plugin,
|
||||||
|
Loading…
Reference in New Issue
Block a user