mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 14:12:59 +00:00
Never add two devices to the daemon with the same ID
Deduplicate based on the ID, without assuming the devices will be the same in-memory object. Also, only emit the changed signal if the device is waiting for a replug. Fixes https://github.com/hughsie/fwupd/issues/364
This commit is contained in:
parent
8da530475d
commit
e1fe34f1ec
@ -307,7 +307,7 @@ fu_device_list_remove (FuDeviceList *self, FuDevice *device)
|
|||||||
g_return_if_fail (FU_IS_DEVICE (device));
|
g_return_if_fail (FU_IS_DEVICE (device));
|
||||||
|
|
||||||
/* check the device already exists */
|
/* check the device already exists */
|
||||||
item = fu_device_list_find_by_device (self, device);
|
item = fu_device_list_find_by_id (self, fu_device_get_id (device), NULL);
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
g_debug ("device %s not found", fu_device_get_id (device));
|
g_debug ("device %s not found", fu_device_get_id (device));
|
||||||
return;
|
return;
|
||||||
@ -384,9 +384,9 @@ fu_device_list_add (FuDeviceList *self, FuDevice *device)
|
|||||||
g_return_if_fail (FU_IS_DEVICE_LIST (self));
|
g_return_if_fail (FU_IS_DEVICE_LIST (self));
|
||||||
g_return_if_fail (FU_IS_DEVICE (device));
|
g_return_if_fail (FU_IS_DEVICE (device));
|
||||||
|
|
||||||
/* verify the device does not already exist */
|
/* is the device waiting to be replugged? */
|
||||||
item = fu_device_list_find_by_device (self, device);
|
item = fu_device_list_find_by_id (self, fu_device_get_id (device), NULL);
|
||||||
if (item != NULL) {
|
if (item != NULL && item->remove_id != 0) {
|
||||||
g_debug ("found existing device %s, reusing item",
|
g_debug ("found existing device %s, reusing item",
|
||||||
fu_device_get_id (item->device));
|
fu_device_get_id (item->device));
|
||||||
if (item->remove_id != 0) {
|
if (item->remove_id != 0) {
|
||||||
@ -397,6 +397,13 @@ fu_device_list_add (FuDeviceList *self, FuDevice *device)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* verify the device does not already exist */
|
||||||
|
if (item != NULL) {
|
||||||
|
g_debug ("device %s already exists, ignoring",
|
||||||
|
fu_device_get_id (item->device));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* verify a compatible device does not already exist */
|
/* verify a compatible device does not already exist */
|
||||||
item = fu_device_list_get_by_guids (self, fu_device_get_guids (device));
|
item = fu_device_list_get_by_guids (self, fu_device_get_guids (device));
|
||||||
if (item != NULL && item->remove_id != 0) {
|
if (item != NULL && item->remove_id != 0) {
|
||||||
|
@ -517,6 +517,7 @@ static void
|
|||||||
fu_device_list_delay_func (void)
|
fu_device_list_delay_func (void)
|
||||||
{
|
{
|
||||||
g_autoptr(FuDevice) device1 = fu_device_new ();
|
g_autoptr(FuDevice) device1 = fu_device_new ();
|
||||||
|
g_autoptr(FuDevice) device2 = fu_device_new ();
|
||||||
g_autoptr(FuDeviceList) device_list = fu_device_list_new ();
|
g_autoptr(FuDeviceList) device_list = fu_device_list_new ();
|
||||||
guint added_cnt = 0;
|
guint added_cnt = 0;
|
||||||
guint changed_cnt = 0;
|
guint changed_cnt = 0;
|
||||||
@ -541,6 +542,19 @@ fu_device_list_delay_func (void)
|
|||||||
g_assert_cmpint (removed_cnt, ==, 0);
|
g_assert_cmpint (removed_cnt, ==, 0);
|
||||||
g_assert_cmpint (changed_cnt, ==, 0);
|
g_assert_cmpint (changed_cnt, ==, 0);
|
||||||
|
|
||||||
|
/* add the same device again */
|
||||||
|
fu_device_list_add (device_list, device1);
|
||||||
|
g_assert_cmpint (added_cnt, ==, 1);
|
||||||
|
g_assert_cmpint (removed_cnt, ==, 0);
|
||||||
|
g_assert_cmpint (changed_cnt, ==, 0);
|
||||||
|
|
||||||
|
/* add a device with the same ID */
|
||||||
|
fu_device_set_id (device2, "device1");
|
||||||
|
fu_device_list_add (device_list, device2);
|
||||||
|
g_assert_cmpint (added_cnt, ==, 1);
|
||||||
|
g_assert_cmpint (removed_cnt, ==, 0);
|
||||||
|
g_assert_cmpint (changed_cnt, ==, 0);
|
||||||
|
|
||||||
/* spin a bit */
|
/* spin a bit */
|
||||||
fu_test_loop_run_with_timeout (10);
|
fu_test_loop_run_with_timeout (10);
|
||||||
fu_test_loop_quit ();
|
fu_test_loop_quit ();
|
||||||
|
Loading…
Reference in New Issue
Block a user