[2/5] vcomp: Implement omp_init_lock and omp_destroy_lock.

Sebastian Lackner sebastian at fds-team.de
Mon Aug 17 23:54:27 CDT 2015


---
 dlls/vcomp/main.c           |   55 +++++++++++++++++++++++++++++++-------------
 dlls/vcomp/vcomp.spec       |    4 +--
 dlls/vcomp100/vcomp100.spec |    4 +--
 dlls/vcomp110/vcomp110.spec |    4 +--
 dlls/vcomp90/vcomp90.spec   |    4 +--
 5 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index 74aaf78..81e3bc8 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -34,6 +34,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(vcomp);
 
+typedef CRITICAL_SECTION *omp_lock_t;
+typedef CRITICAL_SECTION *omp_nest_lock_t;
+
 static struct list vcomp_idle_threads = LIST_INIT(vcomp_idle_threads);
 static DWORD   vcomp_context_tls = TLS_OUT_OF_INDEXES;
 static HMODULE vcomp_module;
@@ -1020,29 +1023,49 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
     __ms_va_end(team_data.valist);
 }
 
+static CRITICAL_SECTION *alloc_critsect(void)
+{
+    CRITICAL_SECTION *critsect;
+    if (!(critsect = HeapAlloc(GetProcessHeap(), 0, sizeof(*critsect))))
+    {
+        ERR("could not allocate critical section\n");
+        ExitProcess(1);
+    }
+
+    InitializeCriticalSection(critsect);
+    critsect->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": critsect");
+    return critsect;
+}
+
+static void destroy_critsect(CRITICAL_SECTION *critsect)
+{
+    if (!critsect) return;
+    critsect->DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(critsect);
+    HeapFree(GetProcessHeap(), 0, critsect);
+}
+
+void CDECL omp_init_lock(omp_lock_t *lock)
+{
+    TRACE("(%p)\n", lock);
+    *lock = alloc_critsect();
+}
+
+void CDECL omp_destroy_lock(omp_lock_t *lock)
+{
+    TRACE("(%p)\n", lock);
+    destroy_critsect(*lock);
+}
+
 void CDECL _vcomp_enter_critsect(CRITICAL_SECTION **critsect)
 {
     TRACE("(%p)\n", critsect);
 
     if (!*critsect)
     {
-        CRITICAL_SECTION *new_critsect;
-        if (!(new_critsect = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_critsect))))
-        {
-            ERR("could not allocate critical section\n");
-            ExitProcess(1);
-        }
-
-        InitializeCriticalSection(new_critsect);
-        new_critsect->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": critsect");
-
+        CRITICAL_SECTION *new_critsect = alloc_critsect();
         if (interlocked_cmpxchg_ptr((void **)critsect, new_critsect, NULL) != NULL)
-        {
-            /* someone beat us to it */
-            new_critsect->DebugInfo->Spare[0] = 0;
-            DeleteCriticalSection(new_critsect);
-            HeapFree(GetProcessHeap(), 0, new_critsect);
-        }
+            destroy_critsect(new_critsect);  /* someone beat us to it */
     }
 
     EnterCriticalSection(*critsect);
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index 40110d2..e078af9 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -88,7 +88,7 @@
 @ cdecl _vcomp_set_num_threads(long)
 @ cdecl _vcomp_single_begin(long)
 @ cdecl _vcomp_single_end()
-@ stub omp_destroy_lock
+@ cdecl omp_destroy_lock(ptr)
 @ stub omp_destroy_nest_lock
 @ cdecl omp_get_dynamic()
 @ cdecl omp_get_max_threads()
@@ -99,7 +99,7 @@
 @ stub omp_get_wtick
 @ cdecl omp_get_wtime()
 @ cdecl omp_in_parallel()
-@ stub omp_init_lock
+@ cdecl omp_init_lock(ptr)
 @ stub omp_init_nest_lock
 @ cdecl omp_set_dynamic(long)
 @ stub omp_set_lock
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index 1974f7e..017f49e 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -88,7 +88,7 @@
 @ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
 @ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
 @ cdecl _vcomp_single_end() vcomp._vcomp_single_end
-@ stub omp_destroy_lock
+@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
 @ stub omp_destroy_nest_lock
 @ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
 @ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@@ -99,7 +99,7 @@
 @ stub omp_get_wtick
 @ cdecl omp_get_wtime() vcomp.omp_get_wtime
 @ cdecl omp_in_parallel() vcomp.omp_in_parallel
-@ stub omp_init_lock
+@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
 @ stub omp_init_nest_lock
 @ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
 @ stub omp_set_lock
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index d1b27ed..a7be1d9 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -89,7 +89,7 @@
 @ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
 @ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
 @ cdecl _vcomp_single_end() vcomp._vcomp_single_end
-@ stub omp_destroy_lock
+@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
 @ stub omp_destroy_nest_lock
 @ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
 @ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@@ -100,7 +100,7 @@
 @ stub omp_get_wtick
 @ cdecl omp_get_wtime() vcomp.omp_get_wtime
 @ cdecl omp_in_parallel() vcomp.omp_in_parallel
-@ stub omp_init_lock
+@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
 @ stub omp_init_nest_lock
 @ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
 @ stub omp_set_lock
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index 1974f7e..017f49e 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -88,7 +88,7 @@
 @ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
 @ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
 @ cdecl _vcomp_single_end() vcomp._vcomp_single_end
-@ stub omp_destroy_lock
+@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
 @ stub omp_destroy_nest_lock
 @ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
 @ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@@ -99,7 +99,7 @@
 @ stub omp_get_wtick
 @ cdecl omp_get_wtime() vcomp.omp_get_wtime
 @ cdecl omp_in_parallel() vcomp.omp_in_parallel
-@ stub omp_init_lock
+@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
 @ stub omp_init_nest_lock
 @ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
 @ stub omp_set_lock
-- 
2.5.0



More information about the wine-patches mailing list