02-shutdown.diff 3.02 KB
Newer Older
Daniel Hiltgen's avatar
Daniel Hiltgen committed
1
diff --git a/examples/server/server.cpp b/examples/server/server.cpp
Daniel Hiltgen's avatar
Daniel Hiltgen committed
2
index a0b46970..7800c6e7 100644
Daniel Hiltgen's avatar
Daniel Hiltgen committed
3
4
5
6
7
8
9
10
11
12
--- a/examples/server/server.cpp
+++ b/examples/server/server.cpp
@@ -28,6 +28,7 @@
 #include <chrono>
 #include <condition_variable>
 #include <atomic>
+#include <signal.h>
 
 using json = nlohmann::json;
 
Daniel Hiltgen's avatar
Daniel Hiltgen committed
13
@@ -2511,6 +2512,9 @@ static void append_to_generated_text_from_generated_token_probs(llama_server_con
Daniel Hiltgen's avatar
Daniel Hiltgen committed
14
15
16
17
18
19
20
21
22
     }
 }
 
+std::function<void(int)> shutdown_handler;
+inline void signal_handler(int signal) { shutdown_handler(signal); }
+
 int main(int argc, char **argv)
 {
 #if SERVER_VERBOSE != 1
Daniel Hiltgen's avatar
Daniel Hiltgen committed
23
@@ -3128,8 +3132,25 @@ int main(int argc, char **argv)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
24
25
26
27
28
29
30
31
         std::placeholders::_2,
         std::placeholders::_3
     ));
-    llama.queue_tasks.start_loop();
 
+    shutdown_handler = [&](int) {
+        llama.queue_tasks.terminate();
+    };
Daniel Hiltgen's avatar
Daniel Hiltgen committed
32
33
34
35
36
37
38
39
40
41
42
43
44
+
+#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__))
+    struct sigaction sigint_action;
+    sigint_action.sa_handler = signal_handler;
+    sigemptyset (&sigint_action.sa_mask);
+    sigint_action.sa_flags = 0;
+    sigaction(SIGINT, &sigint_action, NULL);
+#elif defined (_WIN32)
+    auto console_ctrl_handler = +[](DWORD ctrl_type) -> BOOL {
+        return (ctrl_type == CTRL_C_EVENT) ? (signal_handler(SIGINT), true) : false;
+    };
+    SetConsoleCtrlHandler(reinterpret_cast<PHANDLER_ROUTINE>(console_ctrl_handler), true);
+#endif
Daniel Hiltgen's avatar
Daniel Hiltgen committed
45
46
47
48
49
50
+    llama.queue_tasks.start_loop();
+    svr.stop();
     t.join();
 
     llama_backend_free();
diff --git a/examples/server/utils.hpp b/examples/server/utils.hpp
Daniel Hiltgen's avatar
Daniel Hiltgen committed
51
index 54854896..0ee670db 100644
Daniel Hiltgen's avatar
Daniel Hiltgen committed
52
53
--- a/examples/server/utils.hpp
+++ b/examples/server/utils.hpp
Daniel Hiltgen's avatar
Daniel Hiltgen committed
54
@@ -220,6 +220,7 @@ inline std::string format_chatml(std::vector<json> messages)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
55
56
57
 struct llama_server_queue {
     int id = 0;
     std::mutex mutex_tasks;
Daniel Hiltgen's avatar
Daniel Hiltgen committed
58
+    bool running;
Daniel Hiltgen's avatar
Daniel Hiltgen committed
59
60
61
     // queues
     std::vector<task_server> queue_tasks;
     std::vector<task_server> queue_tasks_deferred;
Daniel Hiltgen's avatar
Daniel Hiltgen committed
62
@@ -278,9 +279,18 @@ struct llama_server_queue {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
63
64
65
66
67
68
69
         queue_tasks_deferred.clear();
     }
 
-    // Start the main loop. This call is blocking
-    [[noreturn]]
+    // end the start_loop routine
+    void terminate() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
70
71
72
73
+        {
+            std::unique_lock<std::mutex> lock(mutex_tasks);
+            running = false;
+        }
Daniel Hiltgen's avatar
Daniel Hiltgen committed
74
75
76
77
78
79
80
81
82
+        condition_tasks.notify_all();
+    }
+
+    // Start the main loop.
     void start_loop() {
+        running = true;
         while (true) {
             // new task arrived
             LOG_VERBOSE("have new task", {});
Daniel Hiltgen's avatar
Daniel Hiltgen committed
83
@@ -324,8 +334,12 @@ struct llama_server_queue {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
84
85
86
             {
                 std::unique_lock<std::mutex> lock(mutex_tasks);
                 if (queue_tasks.empty()) {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
87
+                    if (!running) {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
88
89
90
91
92
+                        LOG_VERBOSE("ending start_loop", {});
+                        return;
+                    }
                     condition_tasks.wait(lock, [&]{
-                        return !queue_tasks.empty();
Daniel Hiltgen's avatar
Daniel Hiltgen committed
93
+                        return (!queue_tasks.empty() || !running);
Daniel Hiltgen's avatar
Daniel Hiltgen committed
94
95
96
                     });
                 }
             }