Zebediah Figura : user32: Introduce and use an array_reserve() helper.
Alexandre Julliard
julliard at winehq.org
Thu Jul 4 15:53:46 CDT 2019
Module: wine
Branch: master
Commit: e1d6146fca36179fe9ed8d7bd5326206b2a89dcd
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e1d6146fca36179fe9ed8d7bd5326206b2a89dcd
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Tue Jul 2 18:07:59 2019 -0500
user32: Introduce and use an array_reserve() helper.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/rawinput.c | 51 +++++++++++++++++++++++++++++++-------------------
1 file changed, 32 insertions(+), 19 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 56ea249..2949264 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -58,6 +58,33 @@ static CRITICAL_SECTION_DEBUG hid_devices_cs_debug =
};
static CRITICAL_SECTION hid_devices_cs = { &hid_devices_cs_debug, -1, 0, 0, 0, 0 };
+static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int count, unsigned int size)
+{
+ unsigned int new_capacity, max_capacity;
+ void *new_elements;
+
+ if (count <= *capacity)
+ return TRUE;
+
+ max_capacity = ~(SIZE_T)0 / size;
+ if (count > max_capacity)
+ return FALSE;
+
+ new_capacity = max(4, *capacity);
+ while (new_capacity < count && new_capacity <= max_capacity / 2)
+ new_capacity *= 2;
+ if (new_capacity < count)
+ new_capacity = max_capacity;
+
+ if (!(new_elements = heap_realloc(*elements, new_capacity * size)))
+ return FALSE;
+
+ *elements = new_elements;
+ *capacity = new_capacity;
+
+ return TRUE;
+}
+
static void find_hid_devices(void)
{
static ULONGLONG last_check;
@@ -125,26 +152,12 @@ static void find_hid_devices(void)
continue;
}
- if (didx >= hid_devices_max)
+ if (!array_reserve((void **)&hid_devices, &hid_devices_max, didx + 1, sizeof(*hid_devices)))
{
- if (hid_devices)
- {
- hid_devices_max *= 2;
- hid_devices = heap_realloc(hid_devices,
- hid_devices_max * sizeof(hid_devices[0]));
- }
- else
- {
- hid_devices_max = 8;
- hid_devices = heap_alloc(hid_devices_max * sizeof(hid_devices[0]));
- }
- if (!hid_devices)
- {
- ERR("Failed to allocate memory.\n");
- CloseHandle(file);
- heap_free(path);
- goto done;
- }
+ ERR("Failed to allocate memory.\n");
+ CloseHandle(file);
+ heap_free(path);
+ goto done;
}
TRACE("Found HID device %s.\n", debugstr_w(path));
More information about the wine-cvs
mailing list