From: Paul Gofman pgofman@codeweavers.com
--- dlls/msvcp140_atomic_wait/main.c | 26 +++++++++++++++++++ .../msvcp140_atomic_wait.spec | 4 +-- .../tests/msvcp140_atomic_wait.c | 23 ++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp140_atomic_wait/main.c b/dlls/msvcp140_atomic_wait/main.c index 60eda170d21..1ea282427f1 100644 --- a/dlls/msvcp140_atomic_wait/main.c +++ b/dlls/msvcp140_atomic_wait/main.c @@ -17,6 +17,7 @@ */
#include <stdarg.h> +#include "stdint.h" #include "windef.h" #include "winbase.h" #include "wine/debug.h" @@ -210,6 +211,16 @@ struct tzdb_current_zone char *name; };
+struct tzdb_leap_second +{ + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t negative; + uint16_t reserved; +}; + struct tzdb_time_zones * __stdcall __std_tzdb_get_time_zones(void) { DYNAMIC_TIME_ZONE_INFORMATION tzd; @@ -284,3 +295,18 @@ void __stdcall __std_tzdb_delete_current_zone(struct tzdb_current_zone *c) free(c->name); free(c); } + +struct tzdb_leap_second * __stdcall __std_tzdb_get_leap_seconds(size_t prev_size, size_t *new_size) +{ + FIXME("(%#Ix %p) stub\n", prev_size, new_size); + + *new_size = 0; + return NULL; +} + +void __stdcall __std_tzdb_delete_leap_seconds(struct tzdb_leap_second *l) +{ + TRACE("(%p)\n", l); + + free(l); +} diff --git a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec index 164e562baa8..5d23b217b72 100644 --- a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec +++ b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec @@ -22,11 +22,11 @@ @ stdcall __std_release_shared_mutex_for_instance(ptr) @ stdcall __std_submit_threadpool_work(ptr) @ stdcall __std_tzdb_delete_current_zone(ptr) -@ stub __std_tzdb_delete_leap_seconds +@ stdcall __std_tzdb_delete_leap_seconds(ptr) @ stub __std_tzdb_delete_sys_info @ stdcall __std_tzdb_delete_time_zones(ptr) @ stdcall __std_tzdb_get_current_zone() -@ stub __std_tzdb_get_leap_seconds +@ stdcall __std_tzdb_get_leap_seconds(ptr ptr) @ stub __std_tzdb_get_sys_info @ stdcall __std_tzdb_get_time_zones() @ stdcall __std_wait_for_threadpool_work_callbacks(ptr long) diff --git a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c index bd6984b6065..1b950f838a0 100644 --- a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c +++ b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c @@ -19,6 +19,7 @@ #include <stdio.h> #include <process.h>
+#include "stdint.h" #include "windef.h" #include "winbase.h" #include "wine/test.h" @@ -50,6 +51,16 @@ struct tzdb_current_zone char *name; };
+struct tzdb_leap_second +{ + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t negative; + uint16_t reserved; +}; + static unsigned int (__stdcall *p___std_parallel_algorithms_hw_threads)(void);
static void (__stdcall *p___std_bulk_submit_threadpool_work)(PTP_WORK, size_t); @@ -67,6 +78,8 @@ static struct tzdb_time_zones * (__stdcall *p___std_tzdb_get_time_zones)(void); static void (__stdcall *p___std_tzdb_delete_time_zones)(struct tzdb_time_zones *); static struct tzdb_current_zone * (__stdcall *p___std_tzdb_get_current_zone)(void); static void (__stdcall *p___std_tzdb_delete_current_zone)(struct tzdb_current_zone *); +static struct tzdb_leap_second * (__stdcall *p___std_tzdb_get_leap_seconds)(size_t, size_t *); +static void (__stdcall *p___std_tzdb_delete_leap_seconds)(struct tzdb_leap_second *);
#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) @@ -94,6 +107,8 @@ static HMODULE init(void) SET(p___std_tzdb_delete_time_zones, "__std_tzdb_delete_time_zones"); SET(p___std_tzdb_get_current_zone, "__std_tzdb_get_current_zone"); SET(p___std_tzdb_delete_current_zone, "__std_tzdb_delete_current_zone"); + SET(p___std_tzdb_get_leap_seconds, "__std_tzdb_get_leap_seconds"); + SET(p___std_tzdb_delete_leap_seconds, "__std_tzdb_delete_leap_seconds"); return msvcp; }
@@ -359,7 +374,9 @@ static void test___std_tzdb(void) { struct tzdb_current_zone *c; struct tzdb_time_zones *z; + void *leap_seconds; unsigned int i; + size_t size;
if (!p___std_tzdb_get_time_zones) { @@ -394,6 +411,12 @@ static void test___std_tzdb(void)
p___std_tzdb_delete_current_zone(c); p___std_tzdb_delete_time_zones(z); + + size = 0xdeadbeef; + leap_seconds = p___std_tzdb_get_leap_seconds(100, &size); + ok(!leap_seconds, "got %p.\n", leap_seconds); + ok(!size, "got %#Ix.\n", size); + p___std_tzdb_delete_leap_seconds(leap_seconds); }
START_TEST(msvcp140_atomic_wait)