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
8typedef enum {
9 kProcessTypeUv,
10 kProcessTypePty
11} ProcessType;
12
13typedef struct process Process;
14typedef void (*process_exit_cb)(Process *proc, int status, void *data);
15typedef void (*internal_process_cb)(Process *proc);
16
17struct 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
34static 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
58static 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