[3/8] vcomp: Implement _vcomp_set_num_threads and omp_get_thread_num.

Sebastian Lackner sebastian at fds-team.de
Tue Jul 14 14:40:10 CDT 2015


---
 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;
-- 
2.4.5



More information about the wine-patches mailing list