Module: wine Branch: master Commit: f59551c22209e8b4116a5ccfdfb6c28c6144cbf7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f59551c22209e8b4116a5ccfdf...
Author: Sebastian Lackner sebastian@fds-team.de Date: Tue Jul 14 21:40:10 2015 +0200
vcomp: Implement _vcomp_set_num_threads and omp_get_thread_num.
---
dlls/vcomp/main.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-)
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c index b827920..8ec3616 100644 --- a/dlls/vcomp/main.c +++ b/dlls/vcomp/main.c @@ -29,10 +29,54 @@
WINE_DEFAULT_DEBUG_CHANNEL(vcomp);
+static DWORD vcomp_context_tls = TLS_OUT_OF_INDEXES; static int vcomp_max_threads; static int vcomp_num_threads; static BOOL vcomp_nested_fork = FALSE;
+struct vcomp_thread_data +{ + int thread_num; + int fork_threads; +}; + +static inline struct vcomp_thread_data *vcomp_get_thread_data(void) +{ + return (struct vcomp_thread_data *)TlsGetValue(vcomp_context_tls); +} + +static inline void vcomp_set_thread_data(struct vcomp_thread_data *thread_data) +{ + TlsSetValue(vcomp_context_tls, thread_data); +} + +static struct vcomp_thread_data *vcomp_init_thread_data(void) +{ + struct vcomp_thread_data *thread_data = vcomp_get_thread_data(); + if (thread_data) return thread_data; + + if (!(thread_data = HeapAlloc(GetProcessHeap(), 0, sizeof(*thread_data)))) + { + ERR("could not create thread data\n"); + ExitProcess(1); + } + + thread_data->thread_num = 0; + thread_data->fork_threads = 0; + + vcomp_set_thread_data(thread_data); + return thread_data; +} + +static void vcomp_free_thread_data(void) +{ + struct vcomp_thread_data *thread_data = vcomp_get_thread_data(); + if (!thread_data) return; + + HeapFree(GetProcessHeap(), 0, thread_data); + vcomp_set_thread_data(NULL); +} + int CDECL omp_get_dynamic(void) { TRACE("stub\n"); @@ -65,8 +109,8 @@ int CDECL omp_get_num_threads(void)
int CDECL omp_get_thread_num(void) { - TRACE("stub\n"); - return 0; + TRACE("()\n"); + return vcomp_init_thread_data()->thread_num; }
/* Time in seconds since "some time in the past" */ @@ -100,7 +144,9 @@ void CDECL _vcomp_barrier(void)
void CDECL _vcomp_set_num_threads(int num_threads) { - TRACE("(%d): stub\n", num_threads); + TRACE("(%d)\n", num_threads); + if (num_threads >= 1) + vcomp_init_thread_data()->fork_threads = num_threads; }
int CDECL _vcomp_single_begin(int flags) @@ -126,13 +172,35 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) case DLL_PROCESS_ATTACH: { SYSTEM_INFO sysinfo; - DisableThreadLibraryCalls(instance); + + if ((vcomp_context_tls = TlsAlloc()) == TLS_OUT_OF_INDEXES) + { + ERR("Failed to allocate TLS index\n"); + return FALSE; + }
GetSystemInfo(&sysinfo); vcomp_max_threads = sysinfo.dwNumberOfProcessors; vcomp_num_threads = sysinfo.dwNumberOfProcessors; break; } + + case DLL_PROCESS_DETACH: + { + if (reserved) break; + if (vcomp_context_tls != TLS_OUT_OF_INDEXES) + { + vcomp_free_thread_data(); + TlsFree(vcomp_context_tls); + } + break; + } + + case DLL_THREAD_DETACH: + { + vcomp_free_thread_data(); + break; + } }
return TRUE;