neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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 }