1 #ifndef NVIM_EVENT_PROCESS_H
2 #define NVIM_EVENT_PROCESS_H
3 
4 #include "nvim/eval/typval.h"
5 #include "nvim/event/loop.h"
6 #include "nvim/event/rstream.h"
7 #include "nvim/event/wstream.h"
8 
9 typedef enum {
10   kProcessTypeUv,
11   kProcessTypePty,
12 } ProcessType;
13 
14 typedef struct process Process;
15 typedef void (*process_exit_cb)(Process *proc, int status, void *data);
16 typedef void (*internal_process_cb)(Process *proc);
17 
18 struct process {
19   ProcessType type;
20   Loop *loop;
21   void *data;
22   int pid, status, refcount;
23   uint8_t exit_signal;  // Signal used when killing (on Windows).
24   uint64_t stopped_time;  // process_stop() timestamp
25   const char *cwd;
26   char **argv;
27   dict_T *env;
28   Stream in, out, err;
29   /// Exit handler. If set, user must call process_free().
30   process_exit_cb cb;
31   internal_process_cb internal_exit_cb, internal_close_cb;
32   bool closed, detach, overlapped;
33   MultiQueue *events;
34 };
35 
36 
process_init(Loop * loop,ProcessType type,void * data)37 static inline Process process_init(Loop *loop, ProcessType type, void *data)
38 {
39   return (Process) {
40     .type = type,
41     .data = data,
42     .loop = loop,
43     .events = NULL,
44     .pid = 0,
45     .status = -1,
46     .refcount = 0,
47     .stopped_time = 0,
48     .cwd = NULL,
49     .argv = NULL,
50     .in = { .closed = false },
51     .out = { .closed = false },
52     .err = { .closed = false },
53     .cb = NULL,
54     .closed = false,
55     .internal_close_cb = NULL,
56     .internal_exit_cb = NULL,
57     .detach = false
58   };
59 }
60 
process_is_stopped(Process * proc)61 static inline bool process_is_stopped(Process *proc)
62 {
63   bool exited = (proc->status >= 0);
64   return exited || (proc->stopped_time != 0);
65 }
66 
67 #ifdef INCLUDE_GENERATED_DECLARATIONS
68 # include "event/process.h.generated.h"
69 #endif
70 #endif  // NVIM_EVENT_PROCESS_H
71