[2/7] vcomp: Fix handling of _vcomp_fork with ifval == FALSE.

Sebastian Lackner sebastian at fds-team.de
Sun Jul 19 22:15:49 CDT 2015


Forks with ifval == FALSE do not count as "parallel", so nested forks are
still allowed. Please note that calling _vcomp_fork(FALSE, ...) or directly
calling the callback is still different in some aspects, the synchronization
functions run in a different context for example.

---
 dlls/vcomp/main.c        |   10 ++++++++--
 dlls/vcomp/tests/vcomp.c |   23 ++++++++++++++++++++---
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index 6e99d21..1dad029 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -54,6 +54,7 @@ struct vcomp_thread_data
     struct vcomp_team_data  *team;
     struct vcomp_task_data  *task;
     int                     thread_num;
+    BOOL                    parallel;
     int                     fork_threads;
 
     /* only used for concurrent tasks */
@@ -203,6 +204,7 @@ static struct vcomp_thread_data *vcomp_init_thread_data(void)
     thread_data->team           = NULL;
     thread_data->task           = &data->task;
     thread_data->thread_num     = 0;
+    thread_data->parallel       = FALSE;
     thread_data->fork_threads   = 0;
     thread_data->section        = 1;
 
@@ -410,10 +412,11 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
 
     TRACE("(%d, %d, %p, ...)\n", ifval, nargs, wrapper);
 
+    if (prev_thread_data->parallel && !vcomp_nested_fork)
+        ifval = FALSE;
+
     if (!ifval)
         num_threads = 1;
-    else if (prev_thread_data->team && !vcomp_nested_fork)
-        num_threads = 1;
     else if (prev_thread_data->fork_threads)
         num_threads = prev_thread_data->fork_threads;
     else
@@ -433,6 +436,7 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
     thread_data.team            = &team_data;
     thread_data.task            = &task_data;
     thread_data.thread_num      = 0;
+    thread_data.parallel        = ifval || prev_thread_data->parallel;
     thread_data.fork_threads    = 0;
     thread_data.section         = 1;
     list_init(&thread_data.entry);
@@ -450,6 +454,7 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
             data->team          = &team_data;
             data->task          = &task_data;
             data->thread_num    = team_data.num_threads++;
+            data->parallel      = thread_data.parallel;
             data->fork_threads  = 0;
             data->section       = 1;
             list_remove(&data->entry);
@@ -470,6 +475,7 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
             data->team          = &team_data;
             data->task          = &task_data;
             data->thread_num    = team_data.num_threads;
+            data->parallel      = thread_data.parallel;
             data->fork_threads  = 0;
             data->section       = 1;
             InitializeConditionVariable(&data->cond);
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
index a96f957..dd91b4f 100644
--- a/dlls/vcomp/tests/vcomp.c
+++ b/dlls/vcomp/tests/vcomp.c
@@ -208,17 +208,21 @@ static void CDECL num_threads_cb(BOOL nested, int nested_threads, LONG *count)
     thread_count = 0;
     p_vcomp_fork(TRUE, 1, num_threads_cb2, &thread_count);
     if (nested)
-        ok(thread_count == nested_threads, "expected %d thread, got %d\n", nested_threads, thread_count);
+        ok(thread_count == nested_threads, "expected %d threads, got %d\n", nested_threads, thread_count);
     else
         ok(thread_count == 1, "expected 1 thread, got %d\n", thread_count);
 
+    thread_count = 0;
+    p_vcomp_fork(FALSE, 1, num_threads_cb2, &thread_count);
+    ok(thread_count == 1, "expected 1 thread, got %d\n", thread_count);
+
     p_vcomp_set_num_threads(4);
     thread_count = 0;
     p_vcomp_fork(TRUE, 1, num_threads_cb2, &thread_count);
     if (nested)
-        ok(thread_count == 4 , "expected 4 thread, got %d\n", thread_count);
+        ok(thread_count == 4, "expected 4 threads, got %d\n", thread_count);
     else
-        ok(thread_count == 1 , "expected 1 thread, got %d\n", thread_count);
+        ok(thread_count == 1, "expected 1 thread, got %d\n", thread_count);
 }
 
 static void test_omp_get_num_threads(BOOL nested)
@@ -241,6 +245,19 @@ static void test_omp_get_num_threads(BOOL nested)
     p_vcomp_fork(TRUE, 3, num_threads_cb, nested, max_threads, &thread_count);
     ok(thread_count == max_threads, "expected %d threads, got %d\n", max_threads, thread_count);
 
+    num_threads = pomp_get_num_threads();
+    ok(num_threads == 1, "expected num_threads == 1, got %d\n", num_threads);
+    thread_count = 0;
+    p_vcomp_fork(FALSE, 3, num_threads_cb, TRUE, max_threads, &thread_count);
+    ok(thread_count == 1, "expected 1 thread, got %d\n", thread_count);
+
+    pomp_set_num_threads(1);
+    num_threads = pomp_get_num_threads();
+    ok(num_threads == 1, "expected num_threads == 1, got %d\n", num_threads);
+    thread_count = 0;
+    p_vcomp_fork(TRUE, 3, num_threads_cb, nested, 1, &thread_count);
+    ok(thread_count == 1, "expected 1 thread, got %d\n", thread_count);
+
     pomp_set_num_threads(2);
     num_threads = pomp_get_num_threads();
     ok(num_threads == 1, "expected num_threads == 1, got %d\n", num_threads);
-- 
2.4.5



More information about the wine-patches mailing list