msvcp120: Implemented xtime functions.
This commit is contained in:
parent
13083dcd52
commit
b81e79ed08
|
@ -17246,6 +17246,7 @@ wine_fn_config_dll msvcp100 enable_msvcp100
|
||||||
wine_fn_config_test dlls/msvcp100/tests msvcp100_test
|
wine_fn_config_test dlls/msvcp100/tests msvcp100_test
|
||||||
wine_fn_config_dll msvcp110 enable_msvcp110
|
wine_fn_config_dll msvcp110 enable_msvcp110
|
||||||
wine_fn_config_dll msvcp120 enable_msvcp120
|
wine_fn_config_dll msvcp120 enable_msvcp120
|
||||||
|
wine_fn_config_test dlls/msvcp120/tests msvcp120_test
|
||||||
wine_fn_config_dll msvcp120_app enable_msvcp120_app
|
wine_fn_config_dll msvcp120_app enable_msvcp120_app
|
||||||
wine_fn_config_dll msvcp60 enable_msvcp60
|
wine_fn_config_dll msvcp60 enable_msvcp60
|
||||||
wine_fn_config_test dlls/msvcp60/tests msvcp60_test
|
wine_fn_config_test dlls/msvcp60/tests msvcp60_test
|
||||||
|
|
|
@ -3070,6 +3070,7 @@ WINE_CONFIG_DLL(msvcp100)
|
||||||
WINE_CONFIG_TEST(dlls/msvcp100/tests)
|
WINE_CONFIG_TEST(dlls/msvcp100/tests)
|
||||||
WINE_CONFIG_DLL(msvcp110)
|
WINE_CONFIG_DLL(msvcp110)
|
||||||
WINE_CONFIG_DLL(msvcp120)
|
WINE_CONFIG_DLL(msvcp120)
|
||||||
|
WINE_CONFIG_TEST(dlls/msvcp120/tests)
|
||||||
WINE_CONFIG_DLL(msvcp120_app)
|
WINE_CONFIG_DLL(msvcp120_app)
|
||||||
WINE_CONFIG_DLL(msvcp60)
|
WINE_CONFIG_DLL(msvcp60)
|
||||||
WINE_CONFIG_TEST(dlls/msvcp60/tests)
|
WINE_CONFIG_TEST(dlls/msvcp60/tests)
|
||||||
|
|
|
@ -3838,9 +3838,9 @@
|
||||||
@ stub _Xp_setw
|
@ stub _Xp_setw
|
||||||
@ stub _Xp_sqrtx
|
@ stub _Xp_sqrtx
|
||||||
@ stub _Xp_subx
|
@ stub _Xp_subx
|
||||||
@ stub _Xtime_diff_to_millis
|
@ cdecl _Xtime_diff_to_millis(ptr)
|
||||||
@ stub _Xtime_diff_to_millis2
|
@ cdecl _Xtime_diff_to_millis2(ptr ptr)
|
||||||
@ cdecl _Xtime_get_ticks()
|
@ cdecl -ret64 _Xtime_get_ticks()
|
||||||
# extern _Zero
|
# extern _Zero
|
||||||
@ stub __Wcrtomb_lk
|
@ stub __Wcrtomb_lk
|
||||||
@ stub xtime_get
|
@ cdecl xtime_get(ptr long)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
TESTDLL = msvcp120.dll
|
||||||
|
APPMODE = -mno-cygwin
|
||||||
|
|
||||||
|
C_SRCS = \
|
||||||
|
msvcp120.c
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Yifu Wang for ESRI
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wine/test.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
|
||||||
|
typedef int MSVCRT_long;
|
||||||
|
|
||||||
|
/* xtime */
|
||||||
|
typedef struct {
|
||||||
|
__time64_t sec;
|
||||||
|
MSVCRT_long nsec;
|
||||||
|
} xtime;
|
||||||
|
|
||||||
|
static MSVCRT_long (__cdecl *p__Xtime_diff_to_millis2)(const xtime*, const xtime*);
|
||||||
|
static int (__cdecl *p_xtime_get)(xtime*, int);
|
||||||
|
|
||||||
|
static HMODULE msvcp;
|
||||||
|
|
||||||
|
static BOOL init(void)
|
||||||
|
{
|
||||||
|
msvcp = LoadLibraryA("msvcp120.dll");
|
||||||
|
if(!msvcp)
|
||||||
|
{
|
||||||
|
win_skip("msvcp120.dll not installed\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
p__Xtime_diff_to_millis2 = (void*)GetProcAddress(msvcp, "_Xtime_diff_to_millis2");
|
||||||
|
p_xtime_get = (void*)GetProcAddress(msvcp, "xtime_get");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test__Xtime_diff_to_millis2(void)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
__time64_t sec_before;
|
||||||
|
MSVCRT_long nsec_before;
|
||||||
|
__time64_t sec_after;
|
||||||
|
MSVCRT_long nsec_after;
|
||||||
|
MSVCRT_long expect;
|
||||||
|
} tests[] = {
|
||||||
|
{1, 0, 2, 0, 1000},
|
||||||
|
{0, 1000000000, 0, 2000000000, 1000},
|
||||||
|
{1, 100000000, 2, 100000000, 1000},
|
||||||
|
{1, 100000000, 1, 200000000, 100},
|
||||||
|
{0, 0, 0, 1000000000, 1000},
|
||||||
|
{0, 0, 0, 1200000000, 1200},
|
||||||
|
{0, 0, 0, 1230000000, 1230},
|
||||||
|
{0, 0, 0, 1234000000, 1234},
|
||||||
|
{0, 0, 0, 1234100000, 1235},
|
||||||
|
{0, 0, 0, 1234900000, 1235},
|
||||||
|
{0, 0, 0, 1234010000, 1235},
|
||||||
|
{0, 0, 0, 1234090000, 1235},
|
||||||
|
{0, 0, 0, 1234000001, 1235},
|
||||||
|
{0, 0, 0, 1234000009, 1235},
|
||||||
|
{0, 0, -1, 0, 0},
|
||||||
|
{0, 0, 0, -10000000, 0},
|
||||||
|
{0, 0, -1, -100000000, 0},
|
||||||
|
{-1, 0, 0, 0, 1000},
|
||||||
|
{0, -100000000, 0, 0, 100},
|
||||||
|
{-1, -100000000, 0, 0, 1100},
|
||||||
|
{0, 0, -1, 2000000000, 1000},
|
||||||
|
{0, 0, -2, 2000000000, 0},
|
||||||
|
{0, 0, -2, 2100000000, 100}
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
MSVCRT_long ret;
|
||||||
|
xtime t1, t2;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof(tests) / sizeof(tests[0]); ++ i)
|
||||||
|
{
|
||||||
|
t1.sec = tests[i].sec_before;
|
||||||
|
t1.nsec = tests[i].nsec_before;
|
||||||
|
t2.sec = tests[i].sec_after;
|
||||||
|
t2.nsec = tests[i].nsec_after;
|
||||||
|
ret = p__Xtime_diff_to_millis2(&t2, &t1);
|
||||||
|
ok(ret == tests[i].expect,
|
||||||
|
"_Xtime_diff_to_millis2(): test: %d expect: %d, got: %d\n",
|
||||||
|
i, tests[i].expect, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_xtime_get(void)
|
||||||
|
{
|
||||||
|
static const MSVCRT_long tests[] = {1, 50, 100, 200, 500};
|
||||||
|
MSVCRT_long diff;
|
||||||
|
xtime before, after;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof(tests) / sizeof(tests[0]); i ++)
|
||||||
|
{
|
||||||
|
p_xtime_get(&before, 1);
|
||||||
|
Sleep(tests[i]);
|
||||||
|
p_xtime_get(&after, 1);
|
||||||
|
|
||||||
|
diff = p__Xtime_diff_to_millis2(&after, &before);
|
||||||
|
|
||||||
|
ok(diff >= tests[i],
|
||||||
|
"xtime_get() not functioning correctly, test: %d, expect: ge %d, got: %d\n",
|
||||||
|
i, tests[i], diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test parameter and return value */
|
||||||
|
before.sec = 0xdeadbeef, before.nsec = 0xdeadbeef;
|
||||||
|
i = p_xtime_get(&before, 0);
|
||||||
|
ok(i == 0, "expect xtime_get() to return 0, got: %d\n", i);
|
||||||
|
ok(before.sec == 0xdeadbeef && before.nsec == 0xdeadbeef,
|
||||||
|
"xtime_get() shouldn't have modified the xtime struct with the given option\n");
|
||||||
|
|
||||||
|
before.sec = 0xdeadbeef, before.nsec = 0xdeadbeef;
|
||||||
|
i = p_xtime_get(&before, 1);
|
||||||
|
ok(i == 1, "expect xtime_get() to return 1, got: %d\n", i);
|
||||||
|
ok(before.sec != 0xdeadbeef && before.nsec != 0xdeadbeef,
|
||||||
|
"xtime_get() should have modified the xtime struct with the given option\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
START_TEST(msvcp120)
|
||||||
|
{
|
||||||
|
if(!init()) return;
|
||||||
|
test__Xtime_diff_to_millis2();
|
||||||
|
test_xtime_get();
|
||||||
|
}
|
|
@ -3838,9 +3838,9 @@
|
||||||
@ stub _Xp_setw
|
@ stub _Xp_setw
|
||||||
@ stub _Xp_sqrtx
|
@ stub _Xp_sqrtx
|
||||||
@ stub _Xp_subx
|
@ stub _Xp_subx
|
||||||
@ stub _Xtime_diff_to_millis
|
@ cdecl _Xtime_diff_to_millis(ptr) msvcp120._Xtime_diff_to_millis
|
||||||
@ stub _Xtime_diff_to_millis2
|
@ cdecl _Xtime_diff_to_millis2(ptr ptr) msvcp120._Xtime_diff_to_millis2
|
||||||
@ cdecl _Xtime_get_ticks() msvcp120._Xtime_get_ticks
|
@ cdecl -ret64 _Xtime_get_ticks() msvcp120._Xtime_get_ticks
|
||||||
# extern _Zero
|
# extern _Zero
|
||||||
@ stub __Wcrtomb_lk
|
@ stub __Wcrtomb_lk
|
||||||
@ stub xtime_get
|
@ cdecl xtime_get(ptr long) msvcp120.xtime_get
|
||||||
|
|
|
@ -33,6 +33,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
|
||||||
#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
|
#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
|
||||||
#define TICKSPERSEC 10000000
|
#define TICKSPERSEC 10000000
|
||||||
#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC)
|
#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC)
|
||||||
|
#define NANOSEC_PER_MILLISEC 1000000
|
||||||
|
#define MILLISEC_PER_SEC 1000
|
||||||
|
|
||||||
struct __Container_proxy;
|
struct __Container_proxy;
|
||||||
|
|
||||||
|
@ -350,6 +352,15 @@ void __thiscall _Container_base12__Swap_all(
|
||||||
that->proxy->cont = that;
|
that->proxy->cont = that;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _MSVCP_VER >= 110
|
||||||
|
typedef int MSVCRT_long;
|
||||||
|
|
||||||
|
/* xtime */
|
||||||
|
typedef struct {
|
||||||
|
__time64_t sec;
|
||||||
|
MSVCRT_long nsec;
|
||||||
|
} xtime;
|
||||||
|
|
||||||
/* _Xtime_get_ticks */
|
/* _Xtime_get_ticks */
|
||||||
LONGLONG __cdecl _Xtime_get_ticks(void)
|
LONGLONG __cdecl _Xtime_get_ticks(void)
|
||||||
{
|
{
|
||||||
|
@ -361,6 +372,49 @@ LONGLONG __cdecl _Xtime_get_ticks(void)
|
||||||
return ((LONGLONG)ft.dwHighDateTime<<32) + ft.dwLowDateTime - TICKS_1601_TO_1970;
|
return ((LONGLONG)ft.dwHighDateTime<<32) + ft.dwLowDateTime - TICKS_1601_TO_1970;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* _xtime_get */
|
||||||
|
int __cdecl xtime_get(xtime* t, int unknown)
|
||||||
|
{
|
||||||
|
LONGLONG ticks;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", t);
|
||||||
|
|
||||||
|
if(unknown != 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ticks = _Xtime_get_ticks();
|
||||||
|
t->sec = ticks / TICKSPERSEC;
|
||||||
|
t->nsec = ticks % TICKSPERSEC * 100;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* _Xtime_diff_to_millis2 */
|
||||||
|
MSVCRT_long __cdecl _Xtime_diff_to_millis2(xtime *t1, xtime *t2)
|
||||||
|
{
|
||||||
|
__time64_t diff_sec;
|
||||||
|
MSVCRT_long diff_nsec, ret;
|
||||||
|
|
||||||
|
TRACE("(%p, %p)\n", t1, t2);
|
||||||
|
|
||||||
|
diff_sec = t1->sec - t2->sec;
|
||||||
|
diff_nsec = t1->nsec - t2->nsec;
|
||||||
|
ret = diff_sec * MILLISEC_PER_SEC +
|
||||||
|
(diff_nsec + NANOSEC_PER_MILLISEC - 1) / NANOSEC_PER_MILLISEC;
|
||||||
|
return ret > 0 ? ret : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* _Xtime_diff_to_millis */
|
||||||
|
MSVCRT_long __cdecl _Xtime_diff_to_millis(xtime *t)
|
||||||
|
{
|
||||||
|
xtime now;
|
||||||
|
|
||||||
|
TRACE("%p\n", t);
|
||||||
|
|
||||||
|
xtime_get(&now, 1);
|
||||||
|
return _Xtime_diff_to_millis2(t, &now);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if _MSVCP_VER >= 90
|
#if _MSVCP_VER >= 90
|
||||||
unsigned int __cdecl _Random_device(void)
|
unsigned int __cdecl _Random_device(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue