[PATCH 0/3] MR5578: Draft: msvcp140_atomic_wait: Partially implement __std_tzdb functions.
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 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/5578
From: Aida Jonikienė <aidas957(a)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) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5578
From: Aida Jonikienė <aidas957(a)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) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5578
From: Aida Jonikienė <aidas957(a)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); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5578
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
participants (2)
-
Aida Jonikienė -
Marvin