Sebastian Lackner : vcomp: Implement _vcomp_barrier.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 17 08:03:40 CDT 2015


Module: wine
Branch: master
Commit: e26a9fb4ad099e22ea478f5bf376373793a729a9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e26a9fb4ad099e22ea478f5bf376373793a729a9

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Thu Jul 16 15:00:33 2015 +0200

vcomp: Implement _vcomp_barrier.

---

 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;




More information about the wine-cvs mailing list