diff --git a/README.md b/README.md index 6500a75f..5995a30a 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/debian/changelog b/debian/changelog index 7b1ec745..b3e4a94a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,7 @@ +wine-staging (1.7.50) UNRELEASED; urgency=low + * Add patch to implement remaining OpenMP locking functions. + -- Sebastian Lackner 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. diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index fa4bc795..de701773 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -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 diff --git a/patches/vcomp-Functions/0002-vcomp-Implement-omp_init_lock-and-omp_destroy_lock.patch b/patches/vcomp-Functions/0002-vcomp-Implement-omp_init_lock-and-omp_destroy_lock.patch new file mode 100644 index 00000000..9a83304a --- /dev/null +++ b/patches/vcomp-Functions/0002-vcomp-Implement-omp_init_lock-and-omp_destroy_lock.patch @@ -0,0 +1,184 @@ +From 8ae03eb63457887c256bd9ddcc1cc848ab6d0f24 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +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 + diff --git a/patches/vcomp-Functions/0003-vcomp-Export-omp_init_nest_lock-and-omp_destroy_nest.patch b/patches/vcomp-Functions/0003-vcomp-Export-omp_init_nest_lock-and-omp_destroy_nest.patch new file mode 100644 index 00000000..14b7738b --- /dev/null +++ b/patches/vcomp-Functions/0003-vcomp-Export-omp_init_nest_lock-and-omp_destroy_nest.patch @@ -0,0 +1,175 @@ +From f63f4cf4b09773743c44b8778687b77bea01ee35 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +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 + diff --git a/patches/vcomp-Functions/0004-vcomp-Implement-OpenMP-nested-locking-functions.patch b/patches/vcomp-Functions/0004-vcomp-Implement-OpenMP-nested-locking-functions.patch new file mode 100644 index 00000000..97d983d1 --- /dev/null +++ b/patches/vcomp-Functions/0004-vcomp-Implement-OpenMP-nested-locking-functions.patch @@ -0,0 +1,117 @@ +From 3f0b8509cf0b7c720b853046f391c6f3f0b9ed94 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +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 + diff --git a/patches/vcomp-Functions/0005-vcomp-Implement-OpenMP-regular-locking-functions.patch b/patches/vcomp-Functions/0005-vcomp-Implement-OpenMP-regular-locking-functions.patch new file mode 100644 index 00000000..1a043831 --- /dev/null +++ b/patches/vcomp-Functions/0005-vcomp-Implement-OpenMP-regular-locking-functions.patch @@ -0,0 +1,145 @@ +From 78df40d0132f693de1ccae95f91a411ff8ce30dc Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +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 + diff --git a/patches/vcomp-Functions/0006-vcomp-tests-Add-tests-for-function-pointers-of-remai.patch b/patches/vcomp-Functions/0006-vcomp-tests-Add-tests-for-function-pointers-of-remai.patch new file mode 100644 index 00000000..a46651ce --- /dev/null +++ b/patches/vcomp-Functions/0006-vcomp-tests-Add-tests-for-function-pointers-of-remai.patch @@ -0,0 +1,64 @@ +From 2f46b96355314dfe76d6baea838f3f57b0890346 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +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 + diff --git a/patches/vcomp-Functions/definition b/patches/vcomp-Functions/definition index 0c8b1e2b..b6f719b9 100644 --- a/patches/vcomp-Functions/definition +++ b/patches/vcomp-Functions/definition @@ -1 +1,2 @@ Fixes: [39058] Implement stub for vcomp._vcomp_flush +Fixes: [26688] Implement vcomp locking functions