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