From cd8d816d787d5944e67f8f493322238a94421036 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 9 Oct 2018 22:52:33 +0900 Subject: [PATCH] sd-device: dedup enumerated devices --- src/libsystemd/sd-device/device-enumerator.c | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c index c7e5bf4431..3ae283e93c 100644 --- a/src/libsystemd/sd-device/device-enumerator.c +++ b/src/libsystemd/sd-device/device-enumerator.c @@ -792,6 +792,33 @@ static int enumerator_scan_devices_all(sd_device_enumerator *enumerator) { return r; } +static void device_enumerator_dedup_devices(sd_device_enumerator *enumerator) { + sd_device **a, **b, **end; + + assert(enumerator); + + if (enumerator->n_devices <= 1) + return; + + a = enumerator->devices + 1; + b = enumerator->devices; + end = enumerator->devices + enumerator->n_devices; + + for (; a < end; a++) { + const char *devpath_a, *devpath_b; + + assert_se(sd_device_get_devpath(*a, &devpath_a) >= 0); + assert_se(sd_device_get_devpath(*b, &devpath_b) >= 0); + + if (path_equal(devpath_a, devpath_b)) + sd_device_unref(*a); + else + *(++b) = *a; + } + + enumerator->n_devices = b - enumerator->devices + 1; +} + int device_enumerator_scan_devices(sd_device_enumerator *enumerator) { int r = 0, k; size_t i; @@ -822,6 +849,7 @@ int device_enumerator_scan_devices(sd_device_enumerator *enumerator) { } typesafe_qsort(enumerator->devices, enumerator->n_devices, device_compare); + device_enumerator_dedup_devices(enumerator); enumerator->scan_uptodate = true; enumerator->type = DEVICE_ENUMERATION_TYPE_DEVICES; @@ -906,6 +934,7 @@ int device_enumerator_scan_subsystems(sd_device_enumerator *enumerator) { } typesafe_qsort(enumerator->devices, enumerator->n_devices, device_compare); + device_enumerator_dedup_devices(enumerator); enumerator->scan_uptodate = true; enumerator->type = DEVICE_ENUMERATION_TYPE_SUBSYSTEMS;