[PATCH 2/3] d2d1/tests: Run the tests in parallel.

Henri Verbeet hverbeet at codeweavers.com
Fri Aug 17 09:54:10 CDT 2018


Like d3d11.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d2d1/tests/d2d1.c | 132 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 105 insertions(+), 27 deletions(-)

diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 26c81e660ea..a8b67f144b3 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -25,6 +25,15 @@
 #include "initguid.h"
 #include "dwrite.h"
 #include "wincodec.h"
+#include "wine/heap.h"
+
+static BOOL use_mt = TRUE;
+
+static struct test_entry
+{
+    void (*test)(void);
+} *mt_tests;
+size_t mt_tests_size, mt_test_count;
 
 struct resource_readback
 {
@@ -83,6 +92,63 @@ struct expected_geometry_figure
     const struct geometry_segment *segments;
 };
 
+static void queue_test(void (*test)(void))
+{
+    if (mt_test_count >= mt_tests_size)
+    {
+        mt_tests_size = max(16, mt_tests_size * 2);
+        mt_tests = heap_realloc(mt_tests, mt_tests_size * sizeof(*mt_tests));
+    }
+    mt_tests[mt_test_count++].test = test;
+}
+
+static DWORD WINAPI thread_func(void *ctx)
+{
+    LONG *i = ctx, j;
+
+    while (*i < mt_test_count)
+    {
+        j = *i;
+        if (InterlockedCompareExchange(i, j + 1, j) == j)
+            mt_tests[j].test();
+    }
+
+    return 0;
+}
+
+static void run_queued_tests(void)
+{
+    unsigned int thread_count, i;
+    HANDLE *threads;
+    SYSTEM_INFO si;
+    LONG test_idx;
+
+    if (!use_mt)
+    {
+        for (i = 0; i < mt_test_count; ++i)
+        {
+            mt_tests[i].test();
+        }
+
+        return;
+    }
+
+    GetSystemInfo(&si);
+    thread_count = si.dwNumberOfProcessors;
+    threads = heap_calloc(thread_count, sizeof(*threads));
+    for (i = 0, test_idx = 0; i < thread_count; ++i)
+    {
+        threads[i] = CreateThread(NULL, 0, thread_func, &test_idx, 0, NULL);
+        ok(!!threads[i], "Failed to create thread %u.\n", i);
+    }
+    WaitForMultipleObjects(thread_count, threads, TRUE, INFINITE);
+    for (i = 0; i < thread_count; ++i)
+    {
+        CloseHandle(threads[i]);
+    }
+    heap_free(threads);
+}
+
 static void set_point(D2D1_POINT_2F *point, float x, float y)
 {
     point->x = x;
@@ -6465,31 +6531,43 @@ static void test_create_device(void)
 
 START_TEST(d2d1)
 {
-    test_clip();
-    test_state_block();
-    test_color_brush();
-    test_bitmap_brush();
-    test_linear_brush();
-    test_radial_brush();
-    test_path_geometry();
-    test_rectangle_geometry();
-    test_rounded_rectangle_geometry();
-    test_bitmap_formats();
-    test_alpha_mode();
-    test_shared_bitmap();
-    test_bitmap_updates();
-    test_opacity_brush();
-    test_create_target();
-    test_draw_text_layout();
-    test_dc_target();
-    test_hwnd_target();
-    test_bitmap_target();
-    test_desktop_dpi();
-    test_stroke_style();
-    test_gradient();
-    test_draw_geometry();
-    test_gdi_interop();
-    test_layer();
-    test_bezier_intersect();
-    test_create_device();
+    unsigned int argc, i;
+    char **argv;
+
+    argc = winetest_get_mainargs(&argv);
+    for (i = 2; i < argc; ++i)
+    {
+        if (!strcmp(argv[i], "--single"))
+            use_mt = FALSE;
+    }
+
+    queue_test(test_clip);
+    queue_test(test_state_block);
+    queue_test(test_color_brush);
+    queue_test(test_bitmap_brush);
+    queue_test(test_linear_brush);
+    queue_test(test_radial_brush);
+    queue_test(test_path_geometry);
+    queue_test(test_rectangle_geometry);
+    queue_test(test_rounded_rectangle_geometry);
+    queue_test(test_bitmap_formats);
+    queue_test(test_alpha_mode);
+    queue_test(test_shared_bitmap);
+    queue_test(test_bitmap_updates);
+    queue_test(test_opacity_brush);
+    queue_test(test_create_target);
+    queue_test(test_draw_text_layout);
+    queue_test(test_dc_target);
+    queue_test(test_hwnd_target);
+    queue_test(test_bitmap_target);
+    queue_test(test_desktop_dpi);
+    queue_test(test_stroke_style);
+    queue_test(test_gradient);
+    queue_test(test_draw_geometry);
+    queue_test(test_gdi_interop);
+    queue_test(test_layer);
+    queue_test(test_bezier_intersect);
+    queue_test(test_create_device);
+
+    run_queued_tests();
 }
-- 
2.11.0




More information about the wine-devel mailing list