OpenImageViewer requires all of these functions for the file information menu to work.
This implementation references the open-source (Apache 2.0) STL code: https://github.com/microsoft/STL/blob/main/stl/src/tzdb.cpp
From: Aida Jonikienė aidas957@gmail.com
__std_tzdb_get_time_zones() is a stub until ICU can be compiled. --- dlls/msvcp140_atomic_wait/main.c | 63 +++++++++++++++++++ .../msvcp140_atomic_wait.spec | 4 +- 2 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp140_atomic_wait/main.c b/dlls/msvcp140_atomic_wait/main.c index 52ecae486eb..6bfcebe5c5c 100644 --- a/dlls/msvcp140_atomic_wait/main.c +++ b/dlls/msvcp140_atomic_wait/main.c @@ -175,3 +175,66 @@ void __stdcall __std_free_crt(void *ptr) { free(ptr); } + +typedef enum _std_tzdb_error { + success = 0, + win_error = 1, + icu_error = 2, +} __std_tzdb_error; + +typedef struct { + __std_tzdb_error err; + + const char* version; + size_t num_timezones; + const char** names; + const char** links; +} __std_tzdb_time_zones_info; + +__std_tzdb_time_zones_info* __stdcall __std_tzdb_get_time_zones(void) +{ + __std_tzdb_time_zones_info *info; + + FIXME("stub\n"); + + info = calloc(1, sizeof(*info)); + if (!info) + { + ERR("Failed to allocate struct\n"); + return NULL; + } + + /* TODO: Add real timezone info from ICU. */ + info->version = strdup("2024a"); + info->num_timezones = 1; + info->names = calloc(1, sizeof(char *) * info->num_timezones); + info->links = calloc(1, sizeof(char *) * info->num_timezones); + info->names[0] = strdup("Europe/London"); + info->links[0] = strdup("Europe/London"); + return info; +} + +void __stdcall __std_tzdb_delete_time_zones(__std_tzdb_time_zones_info* info) +{ + int i; + + TRACE("(%p)\n", info); + + if (info) + { + if (info->names) + { + for (i = 0; i < info->num_timezones; i++) + free((char *)info->names[i]); + free((char *)info->names); + } + if (info->links) + { + for (i = 0; i < info->num_timezones; i++) + free((char *)info->links[i]); + free((char *)info->links); + } + free((char *)info->version); + } + free(info); +} diff --git a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec index 88ed59adad9..08ccb27fcf7 100644 --- a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec +++ b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec @@ -24,9 +24,9 @@ @ stub __std_tzdb_delete_current_zone @ stub __std_tzdb_delete_leap_seconds @ stub __std_tzdb_delete_sys_info -@ stub __std_tzdb_delete_time_zones +@ stdcall __std_tzdb_delete_time_zones(ptr) @ stub __std_tzdb_get_current_zone @ stub __std_tzdb_get_leap_seconds @ stub __std_tzdb_get_sys_info -@ stub __std_tzdb_get_time_zones +@ stdcall __std_tzdb_get_time_zones() @ stdcall __std_wait_for_threadpool_work_callbacks(ptr long)
From: Aida Jonikienė aidas957@gmail.com
--- dlls/msvcp140_atomic_wait/main.c | 22 +++++++++++++++++++ .../msvcp140_atomic_wait.spec | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp140_atomic_wait/main.c b/dlls/msvcp140_atomic_wait/main.c index 6bfcebe5c5c..78c9fffa725 100644 --- a/dlls/msvcp140_atomic_wait/main.c +++ b/dlls/msvcp140_atomic_wait/main.c @@ -191,6 +191,15 @@ typedef struct { const char** links; } __std_tzdb_time_zones_info;
+typedef struct { + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t negative; + uint16_t reserved; +} __std_tzdb_leap_info; + __std_tzdb_time_zones_info* __stdcall __std_tzdb_get_time_zones(void) { __std_tzdb_time_zones_info *info; @@ -238,3 +247,16 @@ void __stdcall __std_tzdb_delete_time_zones(__std_tzdb_time_zones_info* info) } free(info); } + +__std_tzdb_leap_info* __stdcall __std_tzdb_get_leap_seconds(size_t prev_size, size_t* cur_size) +{ + FIXME("stub\n"); + if (cur_size) *cur_size = 0; + return NULL; +} + +void __stdcall __std_tzdb_delete_leap_seconds(__std_tzdb_leap_info* info) +{ + TRACE("(%p)\n", info); + free(info); +} diff --git a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec index 08ccb27fcf7..ac1dc36ad8c 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) @ stub __std_tzdb_delete_current_zone -@ 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) @ stub __std_tzdb_get_current_zone -@ stub __std_tzdb_get_leap_seconds +@ stdcall __std_tzdb_get_leap_seconds(long ptr) @ stub __std_tzdb_get_sys_info @ stdcall __std_tzdb_get_time_zones() @ stdcall __std_wait_for_threadpool_work_callbacks(ptr long)
From: Aida Jonikienė aidas957@gmail.com
--- .../tests/msvcp140_atomic_wait.c | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+)
diff --git a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c index 882e07c48db..edfe2114d68 100644 --- a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c +++ b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c @@ -28,6 +28,30 @@ typedef struct SRWLOCK srwlock; } shared_mutex;
+typedef enum _std_tzdb_error { + success = 0, + win_error = 1, + icu_error = 2, +} __std_tzdb_error; + +typedef struct { + __std_tzdb_error err; + + const char* version; + size_t num_timezones; + const char** names; + const char** links; +} __std_tzdb_time_zones_info; + +typedef struct { + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t negative; + uint16_t reserved; +} __std_tzdb_leap_info; + static unsigned int (__stdcall *p___std_parallel_algorithms_hw_threads)(void);
static void (__stdcall *p___std_bulk_submit_threadpool_work)(PTP_WORK, size_t); @@ -40,6 +64,11 @@ static void (__stdcall *p___std_atomic_notify_one_direct)(void*); static shared_mutex* (__stdcall *p___std_acquire_shared_mutex_for_instance)(void*); static void (__stdcall *p___std_release_shared_mutex_for_instance)(void*);
+static __std_tzdb_time_zones_info* (__stdcall *p___std_tzdb_get_time_zones)(void); +static void (__stdcall *p___std_tzdb_delete_time_zones)(__std_tzdb_time_zones_info*); +static __std_tzdb_leap_info* (__stdcall *p___std_tzdb_get_leap_seconds)(size_t, size_t*); +static void (__stdcall *p___std_tzdb_delete_leap_seconds)(__std_tzdb_leap_info*); + #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) static HMODULE init(void) @@ -60,6 +89,11 @@ static HMODULE init(void) SET(p___std_atomic_notify_one_direct, "__std_atomic_notify_one_direct"); SET(p___std_acquire_shared_mutex_for_instance, "__std_acquire_shared_mutex_for_instance"); SET(p___std_release_shared_mutex_for_instance, "__std_release_shared_mutex_for_instance"); + + SETNOFAIL(p___std_tzdb_get_time_zones, "__std_tzdb_get_time_zones"); + SETNOFAIL(p___std_tzdb_delete_time_zones, "__std_tzdb_delete_time_zones"); + SETNOFAIL(p___std_tzdb_get_leap_seconds, "__std_tzdb_get_leap_seconds"); + SETNOFAIL(p___std_tzdb_delete_leap_seconds, "__std_tzdb_delete_leap_seconds"); return msvcp; }
@@ -269,6 +303,54 @@ static void test___std_acquire_shared_mutex_for_instance(void) p___std_release_shared_mutex_for_instance(NULL); }
+static void test_tzdb(void) +{ + __std_tzdb_time_zones_info *info = NULL; + __std_tzdb_leap_info *info2 = NULL; + size_t size = 0; + + if (!p___std_tzdb_get_time_zones) + { + win_skip("tzdb functions are not available\n"); + return; + } + + info = p___std_tzdb_get_time_zones(); + ok(info != NULL, "Expected a non-NULL pointer\n"); + if (info) + { + ok(info->err == success, "Expected success error, got %d\n", info->err); + + p___std_tzdb_delete_time_zones(info); + ok(info != NULL, "Expected a non-NULL info pointer after deletion\n"); + ok(info->version != NULL, "Expected a non-NULL version pointer after deletion\n"); + ok(info->names != NULL, "Expected a non-NULL names pointer after deletion\n"); + ok(info->links != NULL, "Expected a non-NULL links pointer after deletion\n"); + ok(info->names[0] != NULL, "Expected a non-NULL names[0] pointer after deletion\n"); + ok(info->links[0] != NULL, "Expected a non-NULL links[0] pointer after deletion\n"); + } + p___std_tzdb_delete_time_zones(NULL); /* This call shouldn't cause a crash. */ + + if (0) /* Crashes on Windows. */ + { + info2 = p___std_tzdb_get_leap_seconds(0, NULL); + ok(info2 == NULL, "Expected a NULL pointer\n"); + } + + info2 = p___std_tzdb_get_leap_seconds(0, &size); + ok(info2 == NULL, "Expected a NULL pointer\n"); + ok(size == 0, "Expected size to be 0\n"); + + /* This function fails without LeapSecondInformation key being present (which is the case on TestBot VMs). + * (Source: https://github.com/microsoft/STL/blob/main/stl/src/tzdb.cpp#L600) */ + /* TODO: Find a working test environment that makes the function succeed and do the testing there. */ + info2 = p___std_tzdb_get_leap_seconds(256, &size); + ok(info2 == NULL, "Expected a NULL pointer\n"); + ok(size == 0, "Expected size to be 0\n"); + + p___std_tzdb_delete_leap_seconds(NULL); /* This call shouldn't cause a crash. */ +} + START_TEST(msvcp140_atomic_wait) { HMODULE msvcp; @@ -281,5 +363,6 @@ START_TEST(msvcp140_atomic_wait) test_threadpool_work(); test___std_atomic_wait_direct(); test___std_acquire_shared_mutex_for_instance(); + test_tzdb(); FreeLibrary(msvcp); }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=145375
Your paranoid android.
=== build (build log) ===
../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:47:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:48:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:49:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:50:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:51:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:52:5: error: unknown type name ���uint16_t��� Task: The exe32 Wine build failed
=== debian11 (build log) ===
../wine/dlls/msvcp140_atomic_wait/main.c:195:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:196:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:197:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:198:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:199:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:200:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:47:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:48:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:49:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:50:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:51:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:52:5: error: unknown type name ���uint16_t��� Task: The win32 Wine build failed
=== debian11b (build log) ===
../wine/dlls/msvcp140_atomic_wait/main.c:195:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:196:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:197:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:198:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:199:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/main.c:200:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:47:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:48:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:49:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:50:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:51:5: error: unknown type name ���uint16_t��� ../wine/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c:52:5: error: unknown type name ���uint16_t��� Task: The wow64 Wine build failed