vcomp: Implement omp_init_lock and omp_destroy_lock.
This commit is contained in:
parent
ce18a73304
commit
a283d14b3d
|
@ -34,6 +34,9 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(vcomp);
|
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 struct list vcomp_idle_threads = LIST_INIT(vcomp_idle_threads);
|
||||||
static DWORD vcomp_context_tls = TLS_OUT_OF_INDEXES;
|
static DWORD vcomp_context_tls = TLS_OUT_OF_INDEXES;
|
||||||
static HMODULE vcomp_module;
|
static HMODULE vcomp_module;
|
||||||
|
@ -1020,29 +1023,49 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...)
|
||||||
__ms_va_end(team_data.valist);
|
__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)
|
void CDECL _vcomp_enter_critsect(CRITICAL_SECTION **critsect)
|
||||||
{
|
{
|
||||||
TRACE("(%p)\n", critsect);
|
TRACE("(%p)\n", critsect);
|
||||||
|
|
||||||
if (!*critsect)
|
if (!*critsect)
|
||||||
{
|
{
|
||||||
CRITICAL_SECTION *new_critsect;
|
CRITICAL_SECTION *new_critsect = alloc_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");
|
|
||||||
|
|
||||||
if (interlocked_cmpxchg_ptr((void **)critsect, new_critsect, NULL) != NULL)
|
if (interlocked_cmpxchg_ptr((void **)critsect, new_critsect, NULL) != NULL)
|
||||||
{
|
destroy_critsect(new_critsect); /* someone beat us to it */
|
||||||
/* someone beat us to it */
|
|
||||||
new_critsect->DebugInfo->Spare[0] = 0;
|
|
||||||
DeleteCriticalSection(new_critsect);
|
|
||||||
HeapFree(GetProcessHeap(), 0, new_critsect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EnterCriticalSection(*critsect);
|
EnterCriticalSection(*critsect);
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
@ cdecl _vcomp_set_num_threads(long)
|
@ cdecl _vcomp_set_num_threads(long)
|
||||||
@ cdecl _vcomp_single_begin(long)
|
@ cdecl _vcomp_single_begin(long)
|
||||||
@ cdecl _vcomp_single_end()
|
@ cdecl _vcomp_single_end()
|
||||||
@ stub omp_destroy_lock
|
@ cdecl omp_destroy_lock(ptr)
|
||||||
@ stub omp_destroy_nest_lock
|
@ stub omp_destroy_nest_lock
|
||||||
@ cdecl omp_get_dynamic()
|
@ cdecl omp_get_dynamic()
|
||||||
@ cdecl omp_get_max_threads()
|
@ cdecl omp_get_max_threads()
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
@ stub omp_get_wtick
|
@ stub omp_get_wtick
|
||||||
@ cdecl omp_get_wtime()
|
@ cdecl omp_get_wtime()
|
||||||
@ cdecl omp_in_parallel()
|
@ cdecl omp_in_parallel()
|
||||||
@ stub omp_init_lock
|
@ cdecl omp_init_lock(ptr)
|
||||||
@ stub omp_init_nest_lock
|
@ stub omp_init_nest_lock
|
||||||
@ cdecl omp_set_dynamic(long)
|
@ cdecl omp_set_dynamic(long)
|
||||||
@ stub omp_set_lock
|
@ stub omp_set_lock
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
||||||
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
||||||
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
|
@ 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
|
@ stub omp_destroy_nest_lock
|
||||||
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
||||||
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
@ stub omp_get_wtick
|
@ stub omp_get_wtick
|
||||||
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
||||||
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
|
@ 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
|
@ stub omp_init_nest_lock
|
||||||
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
||||||
@ stub omp_set_lock
|
@ stub omp_set_lock
|
||||||
|
|
|
@ -89,7 +89,7 @@
|
||||||
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
||||||
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
||||||
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
|
@ 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
|
@ stub omp_destroy_nest_lock
|
||||||
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
||||||
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
@ stub omp_get_wtick
|
@ stub omp_get_wtick
|
||||||
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
||||||
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
|
@ 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
|
@ stub omp_init_nest_lock
|
||||||
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
||||||
@ stub omp_set_lock
|
@ stub omp_set_lock
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
@ cdecl _vcomp_set_num_threads(long) vcomp._vcomp_set_num_threads
|
||||||
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
@ cdecl _vcomp_single_begin(long) vcomp._vcomp_single_begin
|
||||||
@ cdecl _vcomp_single_end() vcomp._vcomp_single_end
|
@ 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
|
@ stub omp_destroy_nest_lock
|
||||||
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
@ cdecl omp_get_dynamic() vcomp.omp_get_dynamic
|
||||||
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
@ cdecl omp_get_max_threads() vcomp.omp_get_max_threads
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
@ stub omp_get_wtick
|
@ stub omp_get_wtick
|
||||||
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
@ cdecl omp_get_wtime() vcomp.omp_get_wtime
|
||||||
@ cdecl omp_in_parallel() vcomp.omp_in_parallel
|
@ 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
|
@ stub omp_init_nest_lock
|
||||||
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
@ cdecl omp_set_dynamic(long) vcomp.omp_set_dynamic
|
||||||
@ stub omp_set_lock
|
@ stub omp_set_lock
|
||||||
|
|
Loading…
Reference in New Issue