]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
Handle signals properly on Windows (#1123)
authorDannyDaemonic <redacted>
Wed, 3 May 2023 01:01:57 +0000 (18:01 -0700)
committerGitHub <redacted>
Wed, 3 May 2023 01:01:57 +0000 (18:01 -0700)
examples/main/main.cpp

index a10256abf362fda4ea71829095c8dd33b3d6e4fd..125c189a38b34523677ec6a8d92e05f86c2f64c3 100644 (file)
@@ -22,6 +22,9 @@
 #include <signal.h>
 #include <unistd.h>
 #elif defined (_WIN32)
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <windows.h>
 #include <signal.h>
 #endif
 
@@ -240,7 +243,10 @@ int main(int argc, char ** argv) {
         sigint_action.sa_flags = 0;
         sigaction(SIGINT, &sigint_action, NULL);
 #elif defined (_WIN32)
-        signal(SIGINT, sigint_handler);
+        auto console_ctrl_handler = [](DWORD ctrl_type) -> BOOL {
+            return (ctrl_type == CTRL_C_EVENT) ? (sigint_handler(SIGINT), true) : false;
+        };
+        SetConsoleCtrlHandler(static_cast<PHANDLER_ROUTINE>(console_ctrl_handler), true);
 #endif
 
         fprintf(stderr, "%s: interactive mode on.\n", __func__);
@@ -519,11 +525,6 @@ int main(int argc, char ** argv) {
                 // potentially set color to indicate we are taking user input
                 set_console_color(con_st, CONSOLE_COLOR_USER_INPUT);
 
-#if defined (_WIN32)
-                // Windows: must reactivate sigint handler after each signal
-                signal(SIGINT, sigint_handler);
-#endif
-
                 if (params.instruct) {
                     printf("\n> ");
                 }
@@ -607,10 +608,6 @@ int main(int argc, char ** argv) {
         }
     }
 
-#if defined (_WIN32)
-    signal(SIGINT, SIG_DFL);
-#endif
-
     llama_print_timings(ctx);
     llama_free(ctx);