Add patch to implement remaining OpenMP locking functions.

This commit is contained in:
Sebastian Lackner 2015-08-11 06:13:36 +02:00
parent 9711296d1f
commit e95a773114
9 changed files with 707 additions and 1 deletions

View File

@ -39,6 +39,11 @@ Wine. All those differences are also documented on the
Included bug fixes and improvements
-----------------------------------
**Bug fixes and features included in the next upcoming release [1]:**
* Implement vcomp locking functions ([Wine Bug #26688](https://bugs.winehq.org/show_bug.cgi?id=26688))
**Bug fixes and features in Wine Staging 1.7.49 [235]:**
*Note: The following list only contains features and bug fixes which are not

4
debian/changelog vendored
View File

@ -1,3 +1,7 @@
wine-staging (1.7.50) UNRELEASED; urgency=low
* Add patch to implement remaining OpenMP locking functions.
-- Sebastian Lackner <sebastian@fds-team.de> Tue, 11 Aug 2015 06:12:14 +0200
wine-staging (1.7.49) unstable; urgency=low
* Added patch to improve stubs for dxgi MakeWindowAssociation and
GetWindowAssociation.

View File

@ -51,7 +51,7 @@ usage()
# Show version information
version()
{
echo "Wine Staging 1.7.49"
echo "Wine Staging 1.7.50 (unreleased)"
echo "Copyright (C) 2014-2015 the Wine Staging project authors."
echo ""
echo "Patchset to be applied on upstream Wine:"
@ -4813,6 +4813,7 @@ fi
# |
# | This patchset fixes the following Wine bugs:
# | * [#39058] Implement stub for vcomp._vcomp_flush
# | * [#26688] Implement vcomp locking functions
# |
# | Modified files:
# | * dlls/vcomp/main.c, dlls/vcomp/tests/vcomp.c, dlls/vcomp/vcomp.spec, dlls/vcomp100/vcomp100.spec,
@ -4820,8 +4821,18 @@ fi
# |
if test "$enable_vcomp_Functions" -eq 1; then
patch_apply vcomp-Functions/0001-vcomp-Implement-_vcomp_flush-and-add-tests.patch
patch_apply vcomp-Functions/0002-vcomp-Implement-omp_init_lock-and-omp_destroy_lock.patch
patch_apply vcomp-Functions/0003-vcomp-Export-omp_init_nest_lock-and-omp_destroy_nest.patch
patch_apply vcomp-Functions/0004-vcomp-Implement-OpenMP-nested-locking-functions.patch
patch_apply vcomp-Functions/0005-vcomp-Implement-OpenMP-regular-locking-functions.patch
patch_apply vcomp-Functions/0006-vcomp-tests-Add-tests-for-function-pointers-of-remai.patch
(
echo '+ { "Sebastian Lackner", "vcomp: Implement _vcomp_flush and add tests.", 1 },';
echo '+ { "Sebastian Lackner", "vcomp: Implement omp_init_lock and omp_destroy_lock.", 1 },';
echo '+ { "Sebastian Lackner", "vcomp: Export omp_init_nest_lock and omp_destroy_nest_lock.", 1 },';
echo '+ { "Sebastian Lackner", "vcomp: Implement OpenMP nested locking functions.", 1 },';
echo '+ { "Sebastian Lackner", "vcomp: Implement OpenMP regular locking functions.", 1 },';
echo '+ { "Sebastian Lackner", "vcomp/tests: Add tests for function pointers of remaining lock functions.", 1 },';
) >> "$patchlist"
fi

View File

@ -0,0 +1,184 @@
From 8ae03eb63457887c256bd9ddcc1cc848ab6d0f24 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 11 Aug 2015 05:45:30 +0200
Subject: vcomp: Implement omp_init_lock and omp_destroy_lock.
---
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 0f733a9..0a5e709 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;
@@ -985,29 +988,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

View File

@ -0,0 +1,175 @@
From f63f4cf4b09773743c44b8778687b77bea01ee35 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 11 Aug 2015 06:02:25 +0200
Subject: vcomp: Export omp_init_nest_lock and omp_destroy_nest_lock.
---
dlls/vcomp/tests/vcomp.c | 22 ++++++++++++++++++++++
dlls/vcomp/vcomp.spec | 4 ++--
dlls/vcomp100/vcomp100.spec | 4 ++--
dlls/vcomp110/vcomp110.spec | 4 ++--
dlls/vcomp90/vcomp90.spec | 4 ++--
5 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
index 3df547a..ccb6792 100644
--- a/dlls/vcomp/tests/vcomp.c
+++ b/dlls/vcomp/tests/vcomp.c
@@ -31,6 +31,9 @@ static BOOL (WINAPI *pActivateActCtx)(HANDLE, ULONG_PTR*);
static BOOL (WINAPI *pDeactivateActCtx)(DWORD, ULONG_PTR);
static VOID (WINAPI *pReleaseActCtx)(HANDLE);
+typedef CRITICAL_SECTION *omp_lock_t;
+typedef CRITICAL_SECTION *omp_nest_lock_t;
+
static void (CDECL *p_vcomp_atomic_add_i4)(int *dest, int val);
static void (CDECL *p_vcomp_atomic_add_r4)(float *dest, float val);
static void (CDECL *p_vcomp_atomic_add_r8)(double *dest, double val);
@@ -70,11 +73,15 @@ static int (CDECL *p_vcomp_sections_next)(void);
static void (CDECL *p_vcomp_set_num_threads)(int num_threads);
static int (CDECL *p_vcomp_single_begin)(int flags);
static void (CDECL *p_vcomp_single_end)(void);
+static void (CDECL *pomp_destroy_lock)(omp_lock_t *lock);
+static void (CDECL *pomp_destroy_nest_lock)(omp_nest_lock_t *lock);
static int (CDECL *pomp_get_max_threads)(void);
static int (CDECL *pomp_get_nested)(void);
static int (CDECL *pomp_get_num_threads)(void);
static int (CDECL *pomp_get_thread_num)(void);
static int (CDECL *pomp_in_parallel)(void);
+static void (CDECL *pomp_init_lock)(omp_lock_t *lock);
+static void (CDECL *pomp_init_nest_lock)(omp_nest_lock_t *lock);
static void (CDECL *pomp_set_nested)(int nested);
static void (CDECL *pomp_set_num_threads)(int num_threads);
@@ -245,11 +252,15 @@ static BOOL init_vcomp(void)
VCOMP_GET_PROC(_vcomp_set_num_threads);
VCOMP_GET_PROC(_vcomp_single_begin);
VCOMP_GET_PROC(_vcomp_single_end);
+ VCOMP_GET_PROC(omp_destroy_lock);
+ VCOMP_GET_PROC(omp_destroy_nest_lock);
VCOMP_GET_PROC(omp_get_max_threads);
VCOMP_GET_PROC(omp_get_nested);
VCOMP_GET_PROC(omp_get_num_threads);
VCOMP_GET_PROC(omp_get_thread_num);
VCOMP_GET_PROC(omp_in_parallel);
+ VCOMP_GET_PROC(omp_init_lock);
+ VCOMP_GET_PROC(omp_init_nest_lock);
VCOMP_GET_PROC(omp_set_nested);
VCOMP_GET_PROC(omp_set_num_threads);
@@ -1278,6 +1289,16 @@ static void test_vcomp_flush(void)
p_vcomp_flush();
}
+static void test_omp_init_nest_lock(void)
+{
+ ok(pomp_init_lock == pomp_init_nest_lock,
+ "expected omp_init_lock == omp_init_nest_lock, got %p and %p\n",
+ pomp_init_lock, pomp_init_nest_lock);
+ ok(pomp_destroy_lock == pomp_destroy_nest_lock,
+ "expected omp_destroy_lock == omp_destroy_nest_lock, got %p and %p\n",
+ pomp_destroy_lock, pomp_destroy_nest_lock);
+}
+
static void test_atomic_integer32(void)
{
struct
@@ -1398,6 +1419,7 @@ START_TEST(vcomp)
test_vcomp_single_begin();
test_vcomp_enter_critsect();
test_vcomp_flush();
+ test_omp_init_nest_lock();
test_atomic_integer32();
test_atomic_float();
test_atomic_double();
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index e078af9..418d176 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -89,7 +89,7 @@
@ cdecl _vcomp_single_begin(long)
@ cdecl _vcomp_single_end()
@ cdecl omp_destroy_lock(ptr)
-@ stub omp_destroy_nest_lock
+@ cdecl omp_destroy_nest_lock(ptr) omp_destroy_lock
@ cdecl omp_get_dynamic()
@ cdecl omp_get_max_threads()
@ cdecl omp_get_nested()
@@ -100,7 +100,7 @@
@ cdecl omp_get_wtime()
@ cdecl omp_in_parallel()
@ cdecl omp_init_lock(ptr)
-@ stub omp_init_nest_lock
+@ cdecl omp_init_nest_lock(ptr) omp_init_lock
@ cdecl omp_set_dynamic(long)
@ stub omp_set_lock
@ stub omp_set_nest_lock
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index 017f49e..8a26b15 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -89,7 +89,7 @@
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
-@ stub omp_destroy_nest_lock
+@ cdecl omp_destroy_nest_lock(ptr) vcomp.omp_destroy_nest_lock
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@ cdecl omp_get_nested() vcomp.omp_get_nested
@@ -100,7 +100,7 @@
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
-@ stub omp_init_nest_lock
+@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
@ stub omp_set_nest_lock
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index a7be1d9..64a4016 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -90,7 +90,7 @@
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
-@ stub omp_destroy_nest_lock
+@ cdecl omp_destroy_nest_lock(ptr) vcomp.omp_destroy_nest_lock
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@ cdecl omp_get_nested() vcomp.omp_get_nested
@@ -101,7 +101,7 @@
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
-@ stub omp_init_nest_lock
+@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
@ stub omp_set_nest_lock
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index 017f49e..8a26b15 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -89,7 +89,7 @@
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
@ cdecl omp_destroy_lock(ptr) vcomp.omp_destroy_lock
-@ stub omp_destroy_nest_lock
+@ cdecl omp_destroy_nest_lock(ptr) vcomp.omp_destroy_nest_lock
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
@ cdecl omp_get_nested() vcomp.omp_get_nested
@@ -100,7 +100,7 @@
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
-@ stub omp_init_nest_lock
+@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
@ stub omp_set_nest_lock
--
2.5.0

View File

@ -0,0 +1,117 @@
From 3f0b8509cf0b7c720b853046f391c6f3f0b9ed94 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 11 Aug 2015 06:06:39 +0200
Subject: vcomp: Implement OpenMP nested locking functions.
---
dlls/vcomp/main.c | 18 ++++++++++++++++++
dlls/vcomp/vcomp.spec | 6 +++---
dlls/vcomp100/vcomp100.spec | 6 +++---
dlls/vcomp110/vcomp110.spec | 6 +++---
dlls/vcomp90/vcomp90.spec | 6 +++---
5 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index 0a5e709..a110c11 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -1022,6 +1022,24 @@ void CDECL omp_destroy_lock(omp_lock_t *lock)
destroy_critsect(*lock);
}
+void CDECL omp_set_nest_lock(omp_nest_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+ EnterCriticalSection(*lock);
+}
+
+void CDECL omp_unset_nest_lock(omp_nest_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+ LeaveCriticalSection(*lock);
+}
+
+int CDECL omp_test_nest_lock(omp_nest_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+ return TryEnterCriticalSection(*lock);
+}
+
void CDECL _vcomp_enter_critsect(CRITICAL_SECTION **critsect)
{
TRACE("(%p)\n", critsect);
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index 418d176..4c89879 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -103,10 +103,10 @@
@ cdecl omp_init_nest_lock(ptr) omp_init_lock
@ cdecl omp_set_dynamic(long)
@ stub omp_set_lock
-@ stub omp_set_nest_lock
+@ cdecl omp_set_nest_lock(ptr)
@ cdecl omp_set_nested(long)
@ cdecl omp_set_num_threads(long)
@ stub omp_test_lock
-@ stub omp_test_nest_lock
+@ cdecl omp_test_nest_lock(ptr)
@ stub omp_unset_lock
-@ stub omp_unset_nest_lock
+@ cdecl omp_unset_nest_lock(ptr)
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index 8a26b15..9021b10 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -103,10 +103,10 @@
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
-@ stub omp_set_nest_lock
+@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
@ stub omp_test_lock
-@ stub omp_test_nest_lock
+@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
@ stub omp_unset_lock
-@ stub omp_unset_nest_lock
+@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index 64a4016..4f7503f 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -104,10 +104,10 @@
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
-@ stub omp_set_nest_lock
+@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
@ stub omp_test_lock
-@ stub omp_test_nest_lock
+@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
@ stub omp_unset_lock
-@ stub omp_unset_nest_lock
+@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index 8a26b15..9021b10 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -103,10 +103,10 @@
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
@ stub omp_set_lock
-@ stub omp_set_nest_lock
+@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
@ stub omp_test_lock
-@ stub omp_test_nest_lock
+@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
@ stub omp_unset_lock
-@ stub omp_unset_nest_lock
+@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
--
2.5.0

View File

@ -0,0 +1,145 @@
From 78df40d0132f693de1ccae95f91a411ff8ce30dc Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 11 Aug 2015 06:08:34 +0200
Subject: vcomp: Implement OpenMP regular locking functions.
---
dlls/vcomp/main.c | 35 +++++++++++++++++++++++++++++++++++
dlls/vcomp/vcomp.spec | 6 +++---
dlls/vcomp100/vcomp100.spec | 6 +++---
dlls/vcomp110/vcomp110.spec | 6 +++---
dlls/vcomp90/vcomp90.spec | 6 +++---
5 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index a110c11..8a87f47 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -1010,6 +1010,12 @@ static void destroy_critsect(CRITICAL_SECTION *critsect)
HeapFree(GetProcessHeap(), 0, critsect);
}
+static BOOL critsect_is_owned(CRITICAL_SECTION *critsect)
+{
+ return critsect->OwningThread == ULongToHandle(GetCurrentThreadId()) &&
+ critsect->RecursionCount;
+}
+
void CDECL omp_init_lock(omp_lock_t *lock)
{
TRACE("(%p)\n", lock);
@@ -1022,6 +1028,35 @@ void CDECL omp_destroy_lock(omp_lock_t *lock)
destroy_critsect(*lock);
}
+void CDECL omp_set_lock(omp_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+
+ if (critsect_is_owned(*lock))
+ {
+ ERR("omp_set_lock called while holding lock %p\n", *lock);
+ ExitProcess(1);
+ }
+
+ EnterCriticalSection(*lock);
+}
+
+void CDECL omp_unset_lock(omp_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+ LeaveCriticalSection(*lock);
+}
+
+int CDECL omp_test_lock(omp_lock_t *lock)
+{
+ TRACE("(%p)\n", lock);
+
+ if (critsect_is_owned(*lock))
+ return 0;
+
+ return TryEnterCriticalSection(*lock);
+}
+
void CDECL omp_set_nest_lock(omp_nest_lock_t *lock)
{
TRACE("(%p)\n", lock);
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index 4c89879..52b929f 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -102,11 +102,11 @@
@ cdecl omp_init_lock(ptr)
@ cdecl omp_init_nest_lock(ptr) omp_init_lock
@ cdecl omp_set_dynamic(long)
-@ stub omp_set_lock
+@ cdecl omp_set_lock(ptr)
@ cdecl omp_set_nest_lock(ptr)
@ cdecl omp_set_nested(long)
@ cdecl omp_set_num_threads(long)
-@ stub omp_test_lock
+@ cdecl omp_test_lock(ptr)
@ cdecl omp_test_nest_lock(ptr)
-@ stub omp_unset_lock
+@ cdecl omp_unset_lock(ptr)
@ cdecl omp_unset_nest_lock(ptr)
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index 9021b10..4b646eb 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -102,11 +102,11 @@
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
-@ stub omp_set_lock
+@ cdecl omp_set_lock(ptr) vcomp.omp_set_lock
@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
-@ stub omp_test_lock
+@ cdecl omp_test_lock(ptr) vcomp.omp_test_lock
@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
-@ stub omp_unset_lock
+@ cdecl omp_unset_lock(ptr) vcomp.omp_unset_lock
@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index 4f7503f..1ee7fba 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -103,11 +103,11 @@
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
-@ stub omp_set_lock
+@ cdecl omp_set_lock(ptr) vcomp.omp_set_lock
@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
-@ stub omp_test_lock
+@ cdecl omp_test_lock(ptr) vcomp.omp_test_lock
@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
-@ stub omp_unset_lock
+@ cdecl omp_unset_lock(ptr) vcomp.omp_unset_lock
@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index 9021b10..4b646eb 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -102,11 +102,11 @@
@ cdecl omp_init_lock(ptr) vcomp.omp_init_lock
@ cdecl omp_init_nest_lock(ptr) vcomp.omp_init_nest_lock
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
-@ stub omp_set_lock
+@ cdecl omp_set_lock(ptr) vcomp.omp_set_lock
@ cdecl omp_set_nest_lock(ptr) vcomp.omp_set_nest_lock
@ cdecl omp_set_nested(long) vcomp.omp_set_nested
@ cdecl omp_set_num_threads(long) vcomp.omp_set_num_threads
-@ stub omp_test_lock
+@ cdecl omp_test_lock(ptr) vcomp.omp_test_lock
@ cdecl omp_test_nest_lock(ptr) vcomp.omp_test_nest_lock
-@ stub omp_unset_lock
+@ cdecl omp_unset_lock(ptr) vcomp.omp_unset_lock
@ cdecl omp_unset_nest_lock(ptr) vcomp.omp_unset_nest_lock
--
2.5.0

View File

@ -0,0 +1,64 @@
From 2f46b96355314dfe76d6baea838f3f57b0890346 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 11 Aug 2015 06:10:50 +0200
Subject: vcomp/tests: Add tests for function pointers of remaining lock
functions.
---
dlls/vcomp/tests/vcomp.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
index ccb6792..821a552 100644
--- a/dlls/vcomp/tests/vcomp.c
+++ b/dlls/vcomp/tests/vcomp.c
@@ -82,8 +82,14 @@ static int (CDECL *pomp_get_thread_num)(void);
static int (CDECL *pomp_in_parallel)(void);
static void (CDECL *pomp_init_lock)(omp_lock_t *lock);
static void (CDECL *pomp_init_nest_lock)(omp_nest_lock_t *lock);
+static void (CDECL *pomp_set_lock)(omp_lock_t *lock);
+static void (CDECL *pomp_set_nest_lock)(omp_nest_lock_t *lock);
static void (CDECL *pomp_set_nested)(int nested);
static void (CDECL *pomp_set_num_threads)(int num_threads);
+static int (CDECL *pomp_test_lock)(omp_lock_t *lock);
+static int (CDECL *pomp_test_nest_lock)(omp_nest_lock_t *lock);
+static void (CDECL *pomp_unset_lock)(omp_lock_t *lock);
+static void (CDECL *pomp_unset_nest_lock)(omp_nest_lock_t *lock);
#define VCOMP_DYNAMIC_FLAGS_STATIC 0x01
#define VCOMP_DYNAMIC_FLAGS_CHUNKED 0x02
@@ -261,8 +267,14 @@ static BOOL init_vcomp(void)
VCOMP_GET_PROC(omp_in_parallel);
VCOMP_GET_PROC(omp_init_lock);
VCOMP_GET_PROC(omp_init_nest_lock);
+ VCOMP_GET_PROC(omp_set_lock);
+ VCOMP_GET_PROC(omp_set_nest_lock);
VCOMP_GET_PROC(omp_set_nested);
VCOMP_GET_PROC(omp_set_num_threads);
+ VCOMP_GET_PROC(omp_test_lock);
+ VCOMP_GET_PROC(omp_test_nest_lock);
+ VCOMP_GET_PROC(omp_unset_lock);
+ VCOMP_GET_PROC(omp_unset_nest_lock);
return TRUE;
}
@@ -1297,6 +1309,16 @@ static void test_omp_init_nest_lock(void)
ok(pomp_destroy_lock == pomp_destroy_nest_lock,
"expected omp_destroy_lock == omp_destroy_nest_lock, got %p and %p\n",
pomp_destroy_lock, pomp_destroy_nest_lock);
+
+ ok(pomp_set_lock != pomp_set_nest_lock,
+ "expected omp_set_lock != omp_set_nest_lock, got %p and %p\n",
+ pomp_set_lock, pomp_set_nest_lock);
+ ok(pomp_unset_lock != pomp_unset_nest_lock,
+ "expected omp_unset_lock != omp_unset_nest_lock, got %p and %p\n",
+ pomp_unset_lock, pomp_unset_nest_lock);
+ ok(pomp_test_lock != pomp_test_nest_lock,
+ "expected omp_test_lock != omp_test_nest_lock, got %p and %p\n",
+ pomp_test_lock, pomp_test_nest_lock);
}
static void test_atomic_integer32(void)
--
2.5.0

View File

@ -1 +1,2 @@
Fixes: [39058] Implement stub for vcomp._vcomp_flush
Fixes: [26688] Implement vcomp locking functions