[3/7] vcomp: Implement _vcomp_barrier. (resend)

Sebastian Lackner sebastian at fds-team.de
Thu Jul 16 08:00:33 CDT 2015


---
 dlls/vcomp/main.c |   28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index 3830879..f085f7c 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -70,6 +70,10 @@ struct vcomp_team_data
     int                     nargs;
     void                    *wrapper;
     __ms_va_list            valist;
+
+    /* barrier */
+    unsigned int            barrier;
+    int                     barrier_count;
 };
 
 #if defined(__i386__)
@@ -256,7 +260,27 @@ void CDECL omp_set_num_threads(int num_threads)
 
 void CDECL _vcomp_barrier(void)
 {
-    TRACE("stub\n");
+    struct vcomp_team_data *team_data = vcomp_init_thread_data()->team;
+
+    TRACE("()\n");
+
+    if (!team_data)
+        return;
+
+    EnterCriticalSection(&vcomp_section);
+    if (++team_data->barrier_count >= team_data->num_threads)
+    {
+        team_data->barrier++;
+        team_data->barrier_count = 0;
+        WakeAllConditionVariable(&team_data->cond);
+    }
+    else
+    {
+        unsigned int barrier = team_data->barrier;
+        while (team_data->barrier == barrier)
+            SleepConditionVariableCS(&team_data->cond, &vcomp_section, INFINITE);
+    }
+    LeaveCriticalSection(&vcomp_section);
 }
 
 void CDECL _vcomp_set_num_threads(int num_threads)
@@ -342,6 +366,8 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
     team_data.nargs             = nargs;
     team_data.wrapper           = wrapper;
     __ms_va_start(team_data.valist, wrapper);
+    team_data.barrier           = 0;
+    team_data.barrier_count     = 0;
 
     thread_data.team            = &team_data;
     thread_data.thread_num      = 0;
-- 
2.4.5



More information about the wine-patches mailing list