Piotr Caban : msvcp120: Add _Thrd_start implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 24 11:01:42 CST 2016


Module: wine
Branch: master
Commit: fb7af057a16ce9d01a358dc0adaf9935d581b9aa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fb7af057a16ce9d01a358dc0adaf9935d581b9aa

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Feb 23 13:13:07 2016 +0100

msvcp120: Add _Thrd_start implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp110/msvcp110.spec         |  2 +-
 dlls/msvcp120/msvcp120.spec         |  2 +-
 dlls/msvcp120_app/msvcp120_app.spec |  2 +-
 dlls/msvcp90/misc.c                 | 35 +++++++++++++++++++++++++++++++++--
 4 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index ae11097..52d292c 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -3864,7 +3864,7 @@
 @ cdecl _Thrd_join(ptr long)
 @ cdecl _Thrd_lt(ptr ptr)
 @ cdecl _Thrd_sleep(ptr)
-@ stub _Thrd_start
+@ cdecl _Thrd_start(ptr ptr ptr)
 @ cdecl _Thrd_yield()
 @ cdecl _Tolower(long ptr)
 @ cdecl _Toupper(long ptr)
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index e78d5ea..c70939b 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -3811,7 +3811,7 @@
 @ cdecl _Thrd_join(ptr long)
 @ cdecl _Thrd_lt(ptr ptr)
 @ cdecl _Thrd_sleep(ptr)
-@ stub _Thrd_start
+@ cdecl _Thrd_start(ptr ptr ptr)
 @ cdecl _Thrd_yield()
 @ cdecl _Tolower(long ptr)
 @ cdecl _Toupper(long ptr)
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index 0330d53..6b6e24c 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -3811,7 +3811,7 @@
 @ cdecl _Thrd_join(ptr long) msvcp120._Thrd_join
 @ cdecl _Thrd_lt(ptr ptr) msvcp120._Thrd_lt
 @ cdecl _Thrd_sleep(ptr) msvcp120._Thrd_sleep
-@ stub _Thrd_start
+@ cdecl _Thrd_start(ptr ptr ptr) msvcp120._Thrd_start
 @ cdecl _Thrd_yield() msvcp120._Thrd_yield
 @ cdecl _Tolower(long ptr) msvcp120._Tolower
 @ cdecl _Toupper(long ptr) msvcp120._Toupper
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index b2adc72..a9efe0a 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -872,10 +872,41 @@ int __cdecl _Thrd_join(_Thrd_t thr, int *code)
     return 0;
 }
 
+int __cdecl _Thrd_start(_Thrd_t *thr, LPTHREAD_START_ROUTINE proc, void *arg)
+{
+    TRACE("(%p %p %p)\n", thr, proc, arg);
+    thr->hnd = CreateThread(NULL, 0, proc, arg, 0, &thr->id);
+    return thr->hnd ? 0 : _THRD_ERROR;
+}
+
+typedef struct
+{
+    _Thrd_start_t proc;
+    void *arg;
+} thread_proc_arg;
+
+static DWORD WINAPI thread_proc_wrapper(void *arg)
+{
+    thread_proc_arg wrapped_arg = *((thread_proc_arg*)arg);
+    free(arg);
+    return wrapped_arg.proc(wrapped_arg.arg);
+}
+
 int __cdecl _Thrd_create(_Thrd_t *thr, _Thrd_start_t proc, void *arg)
 {
+    thread_proc_arg *wrapped_arg;
+    int ret;
+
     TRACE("(%p %p %p)\n", thr, proc, arg);
-    thr->hnd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)proc, arg, 0, &thr->id);
-    return !thr->hnd;
+
+    wrapped_arg = malloc(sizeof(*wrapped_arg));
+    if(!wrapped_arg)
+        return _THRD_ERROR; /* TODO: probably different error should be returned here */
+
+    wrapped_arg->proc = proc;
+    wrapped_arg->arg = arg;
+    ret = _Thrd_start(thr, thread_proc_wrapper, wrapped_arg);
+    if(ret) free(wrapped_arg);
+    return ret;
 }
 #endif




More information about the wine-cvs mailing list