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