signal.c (1460B)
1 #include <stddef.h> 2 #include <uv.h> 3 4 #include "nvim/event/defs.h" 5 #include "nvim/event/loop.h" 6 #include "nvim/event/multiqueue.h" 7 #include "nvim/event/signal.h" 8 #include "nvim/types_defs.h" 9 10 #include "event/signal.c.generated.h" 11 12 void signal_watcher_init(Loop *loop, SignalWatcher *watcher, void *data) 13 FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) 14 { 15 uv_signal_init(&loop->uv, &watcher->uv); 16 watcher->uv.data = watcher; 17 watcher->data = data; 18 watcher->cb = NULL; 19 watcher->events = loop->fast_events; 20 } 21 22 void signal_watcher_start(SignalWatcher *watcher, signal_cb cb, int signum) 23 FUNC_ATTR_NONNULL_ALL 24 { 25 watcher->cb = cb; 26 uv_signal_start(&watcher->uv, signal_watcher_cb, signum); 27 } 28 29 void signal_watcher_stop(SignalWatcher *watcher) 30 FUNC_ATTR_NONNULL_ALL 31 { 32 uv_signal_stop(&watcher->uv); 33 } 34 35 void signal_watcher_close(SignalWatcher *watcher, signal_close_cb cb) 36 FUNC_ATTR_NONNULL_ARG(1) 37 { 38 watcher->close_cb = cb; 39 uv_close((uv_handle_t *)&watcher->uv, close_cb); 40 } 41 42 static void signal_event(void **argv) 43 { 44 SignalWatcher *watcher = argv[0]; 45 watcher->cb(watcher, watcher->uv.signum, watcher->data); 46 } 47 48 static void signal_watcher_cb(uv_signal_t *handle, int signum) 49 { 50 SignalWatcher *watcher = handle->data; 51 CREATE_EVENT(watcher->events, signal_event, watcher); 52 } 53 54 static void close_cb(uv_handle_t *handle) 55 { 56 SignalWatcher *watcher = handle->data; 57 if (watcher->close_cb) { 58 watcher->close_cb(watcher, watcher->data); 59 } 60 }