[PATCH 2/3] msvcrt: Add quick_exit

Piotr Caban piotr.caban at gmail.com
Mon Jun 11 16:02:43 CDT 2018


Hi,

On 06/05/18 22:42, Fabian Maurer wrote:
> +/*********************************************************************
> + *		quick_exit (MSVCRT.@)
> + */
> +void CDECL MSVCRT_quick_exit(int exitcode)
> +{
> +  FIXME("partial stub: (%d)\n", exitcode);
> +  MSVCRT__exit(exitcode);
> +}
quick_exit function should not call exit. I'm attaching a test that 
shows that atexit callbacks should not be called.

Thanks,
Piotr
-------------- next part --------------
From 4dc906aa53f82454d78b0f317e0b13f620fc97c9 Mon Sep 17 00:00:00 2001
From: Piotr Caban <piotr at codeweavers.com>
Date: Mon, 11 Jun 2018 21:50:36 +0200
Subject: [PATCH] ucrtbase: Add quick_exit tests
To: wine-devel <wine-devel at winehq.org>

---
 dlls/ucrtbase/tests/misc.c | 83 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 1 deletion(-)

diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index 354fab1e94..230999eeff 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -125,6 +125,10 @@ static int (CDECL *p_fesetround)(int);
 static void (CDECL *p___setusermatherr)(MSVCRT_matherr_func);
 static int* (CDECL *p_errno)(void);
 static char* (CDECL *p_asctime)(const struct tm *);
+static int (CDECL *p__crt_at_quick_exit)(void (CDECL*)(void));
+static void (CDECL *p_quick_exit)(int);
+static int (CDECL *p__crt_atexit)(void (CDECL*)(void));
+static void (CDECL *p_exit)(int);
 
 static void test__initialize_onexit_table(void)
 {
@@ -429,6 +433,10 @@ static BOOL init(void)
     p___setusermatherr = (void*)GetProcAddress(module, "__setusermatherr");
     p_errno = (void*)GetProcAddress(module, "_errno");
     p_asctime = (void*)GetProcAddress(module, "asctime");
+    p__crt_at_quick_exit = (void*)GetProcAddress(module, "_crt_at_quick_exit");
+    p_quick_exit = (void*)GetProcAddress(module, "quick_exit");
+    p__crt_atexit = (void*)GetProcAddress(module, "_crt_atexit");
+    p_exit = (void*)GetProcAddress(module, "exit");
 
     return TRUE;
 }
@@ -765,6 +773,73 @@ static void test_asctime(void)
     ok(!strcmp(ret, "Thu Jan  1 00:00:00 1970\n"), "asctime returned %s\n", ret);
 }
 
+static void test_quick_exit(const char *argv0)
+{
+    HANDLE quick_exit_event, exit_event;
+    PROCESS_INFORMATION proc;
+    STARTUPINFOA startup;
+    char path[MAX_PATH];
+    DWORD ret;
+
+    quick_exit_event = CreateEventA(NULL, FALSE, FALSE, "quick_exit_event");
+    exit_event = CreateEventA(NULL, FALSE, FALSE, "exit_event");
+
+    sprintf(path, "%s misc quick_exit", argv0);
+    memset(&startup, 0, sizeof(startup));
+    startup.cb = sizeof(startup);
+    CreateProcessA(NULL, path, NULL, NULL, TRUE,
+            0, NULL, NULL, &startup, &proc);
+    winetest_wait_child_process(proc.hProcess);
+    ret = WaitForSingleObject(quick_exit_event, 0);
+    ok(ret == WAIT_OBJECT_0, "quick_exit_event was not set (%x)\n", ret);
+    ret = WaitForSingleObject(exit_event, 0);
+    ok(ret == WAIT_TIMEOUT, "exit_event should not be set (%x)\n", ret);
+
+    sprintf(path, "%s misc exit", argv0);
+    memset(&startup, 0, sizeof(startup));
+    startup.cb = sizeof(startup);
+    CreateProcessA(NULL, path, NULL, NULL, TRUE,
+            0, NULL, NULL, &startup, &proc);
+    winetest_wait_child_process(proc.hProcess);
+    ret = WaitForSingleObject(quick_exit_event, 0);
+    ok(ret == WAIT_TIMEOUT, "quick_exit_event should not be set (%x)\n", ret);
+    ret = WaitForSingleObject(exit_event, 0);
+    ok(ret == WAIT_OBJECT_0, "exit_event was not set (%x)\n", ret);
+
+    CloseHandle(quick_exit_event);
+    CloseHandle(exit_event);
+}
+
+static void CDECL at_quick_exit_func(void)
+{
+    HANDLE quick_exit_event = CreateEventA(NULL, FALSE, FALSE, "quick_exit_event");
+    ok(quick_exit_event != NULL, "CreateEvent failed: %d\n", GetLastError());
+    SetEvent(quick_exit_event);
+    CloseHandle(quick_exit_event);
+}
+
+static void CDECL at_exit_func(void)
+{
+    HANDLE exit_event = CreateEventA(NULL, FALSE, FALSE, "exit_event");
+    ok(exit_event != NULL, "CreateEvent failed: %d\n", GetLastError());
+    SetEvent(exit_event);
+    CloseHandle(exit_event);
+}
+
+static void test_call_quick_exit(void)
+{
+    ok(!p__crt_at_quick_exit(at_quick_exit_func), "_crt_at_quick_exit failed\n");
+    ok(!p__crt_atexit(at_exit_func), "_crt_atexit failed\n");
+    p_quick_exit(0);
+}
+
+static void test_call_exit(void)
+{
+    ok(!p__crt_at_quick_exit(at_quick_exit_func), "_crt_at_quick_exit failed\n");
+    ok(!p__crt_atexit(at_exit_func), "_crt_atexit failed\n");
+    p_exit(0);
+}
+
 START_TEST(misc)
 {
     int arg_c;
@@ -775,7 +850,12 @@ START_TEST(misc)
 
     arg_c = winetest_get_mainargs(&arg_v);
     if(arg_c == 3) {
-        test__get_narrow_winmain_command_line(NULL);
+        if(!strcmp(arg_v[2], "cmd"))
+            test__get_narrow_winmain_command_line(NULL);
+        else if(!strcmp(arg_v[2], "quick_exit"))
+            test_call_quick_exit();
+        else if(!strcmp(arg_v[2], "exit"))
+            test_call_exit();
         return;
     }
 
@@ -791,4 +871,5 @@ START_TEST(misc)
     test_isblank();
     test_math_errors();
     test_asctime();
+    test_quick_exit(arg_v[0]);
 }
-- 
2.16.4



More information about the wine-devel mailing list