Module: wine Branch: master Commit: 95cde2c8b8e1af1b58223a40e2dac9beb320183c URL: http://source.winehq.org/git/wine.git/?a=commit;h=95cde2c8b8e1af1b58223a40e2...
Author: Daniel Lehman dlehman@esri.com Date: Tue Oct 27 23:21:07 2015 -0700
msvcp120: Implement _Thrd_equal/lt.
Signed-off-by: Daniel Lehman dlehman@esri.com Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcp110/msvcp110.spec | 4 +-- dlls/msvcp120/msvcp120.spec | 4 +-- dlls/msvcp120/tests/msvcp120.c | 58 +++++++++++++++++++++++++++++++++++++ dlls/msvcp120_app/msvcp120_app.spec | 4 +-- dlls/msvcp90/misc.c | 20 +++++++++++++ 5 files changed, 84 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index b8d21eb..9fb938a 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -3859,10 +3859,10 @@ @ stub _Thrd_create @ stub _Thrd_current @ stub _Thrd_detach -@ stub _Thrd_equal +@ cdecl _Thrd_equal(ptr ptr) @ stub _Thrd_exit @ stub _Thrd_join -@ stub _Thrd_lt +@ cdecl _Thrd_lt(ptr ptr) @ stub _Thrd_sleep @ stub _Thrd_start @ stub _Thrd_yield diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 0458b01..c25e2e4 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -3806,10 +3806,10 @@ @ stub _Thrd_create @ stub _Thrd_current @ stub _Thrd_detach -@ stub _Thrd_equal +@ cdecl _Thrd_equal(ptr ptr) @ stub _Thrd_exit @ stub _Thrd_join -@ stub _Thrd_lt +@ cdecl _Thrd_lt(ptr ptr) @ stub _Thrd_sleep @ stub _Thrd_start @ stub _Thrd_yield diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c index d754191..fc69fd0 100644 --- a/dlls/msvcp120/tests/msvcp120.c +++ b/dlls/msvcp120/tests/msvcp120.c @@ -130,6 +130,16 @@ static enum file_type (__cdecl *p_tr2_sys__Lstat)(char const*, int *); static __int64 (__cdecl *p_tr2_sys__Last_write_time)(char const*); static void (__cdecl *p_tr2_sys__Last_write_time_set)(char const*, __int64);
+/* thrd */ +typedef struct +{ + HANDLE hnd; + DWORD id; +} _Thrd_t; + +static int (__cdecl *p__Thrd_equal)(_Thrd_t, _Thrd_t); +static int (__cdecl *p__Thrd_lt)(_Thrd_t, _Thrd_t); + static HMODULE msvcp; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) @@ -253,6 +263,10 @@ static BOOL init(void) SET(p_tr2_sys__Last_write_time_set, "?_Last_write_time@sys@tr2@std@@YAXPBD_J@Z"); } + SET(p__Thrd_equal, + "_Thrd_equal"); + SET(p__Thrd_lt, + "_Thrd_lt");
msvcr = GetModuleHandleA("msvcr120.dll"); p_setlocale = (void*)GetProcAddress(msvcr, "setlocale"); @@ -1120,6 +1134,47 @@ static void test_tr2_sys__Last_write_time(void) ok(ret == 1, "test_tr2_sys__Remove_dir(): expect 1 got %d\n", ret); }
+static void test_thrd(void) +{ + int ret, i; + struct test { + _Thrd_t a; + _Thrd_t b; + int r; + }; + const HANDLE hnd1 = (HANDLE)0xcccccccc; + const HANDLE hnd2 = (HANDLE)0xdeadbeef; + + struct test testeq[] = { + { {0, 0}, {0, 0}, 1 }, + { {0, 1}, {0, 0}, 0 }, + { {hnd1, 0}, {hnd1, 1}, 0 }, + { {hnd1, 0}, {hnd2, 0}, 1 } + }; + + struct test testlt[] = { + { {0, 0}, {0, 0}, 0 }, + { {0, 0}, {0, 1}, 1 }, + { {0, 1}, {0, 0}, 0 }, + { {hnd1, 0}, {hnd2, 0}, 0 }, + { {hnd1, 0}, {hnd2, 1}, 1 } + }; + + /* test for equal */ + for(i=0; i<sizeof(testeq)/sizeof(testeq[0]); i++) { + ret = p__Thrd_equal(testeq[i].a, testeq[i].b); + ok(ret == testeq[i].r, "(%p %u) = (%p %u) expected %d, got %d\n", + testeq[i].a.hnd, testeq[i].a.id, testeq[i].b.hnd, testeq[i].b.id, testeq[i].r, ret); + } + + /* test for less than */ + for(i=0; i<sizeof(testlt)/sizeof(testlt[0]); i++) { + ret = p__Thrd_lt(testlt[i].a, testlt[i].b); + ok(ret == testlt[i].r, "(%p %u) < (%p %u) expected %d, got %d\n", + testlt[i].a.hnd, testlt[i].a.id, testlt[i].b.hnd, testlt[i].b.id, testlt[i].r, ret); + } +} + START_TEST(msvcp120) { if(!init()) return; @@ -1143,5 +1198,8 @@ START_TEST(msvcp120) test_tr2_sys__Statvfs(); test_tr2_sys__Stat(); test_tr2_sys__Last_write_time(); + + test_thrd(); + FreeLibrary(msvcp); } diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index 2598904..6fd94ae 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -3806,10 +3806,10 @@ @ stub _Thrd_create @ stub _Thrd_current @ stub _Thrd_detach -@ stub _Thrd_equal +@ cdecl _Thrd_equal(ptr ptr) msvcp120._Thrd_equal @ stub _Thrd_exit @ stub _Thrd_join -@ stub _Thrd_lt +@ cdecl _Thrd_lt(ptr ptr) msvcp120._Thrd_lt @ stub _Thrd_sleep @ stub _Thrd_start @ stub _Thrd_yield diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c index 6501ff9..2ec34fe 100644 --- a/dlls/msvcp90/misc.c +++ b/dlls/msvcp90/misc.c @@ -683,3 +683,23 @@ void init_misc(void *base) iostream_category_ctor(&iostream_category); #endif } + +#if _MSVCP_VER >= 110 +typedef struct +{ + HANDLE hnd; + DWORD id; +} _Thrd_t; + +int __cdecl _Thrd_equal(_Thrd_t a, _Thrd_t b) +{ + TRACE("(%p %u %p %u)\n", a.hnd, a.id, b.hnd, b.id); + return a.id == b.id; +} + +int __cdecl _Thrd_lt(_Thrd_t a, _Thrd_t b) +{ + TRACE("(%p %u %p %u)\n", a.hnd, a.id, b.hnd, b.id); + return a.id < b.id; +} +#endif