aboutsummaryrefslogtreecommitdiff
path: root/src/os/job.h
blob: 0350f44d5843ca54f7b73f180a2b24ef686bd30a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Job is a short name we use to refer to child processes that run in parallel
// with the editor, probably executing long-running tasks and sending updates
// asynchronously. Communication happens through anonymous pipes connected to
// the job's std{in,out,err}. They are more like bash/zsh co-processes than the
// usual shell background job. The name 'Job' was chosen because it applies to
// the concept while being significantly shorter.
#ifndef NEOVIM_OS_JOB_H
#define NEOVIM_OS_JOB_H

#include <stdint.h>
#include <stdbool.h>

#include "os/event.h"

/// Function called when the job reads data
///
/// @param id The job is
/// @param data Some data associated with the job by the caller
/// @param buffer Buffer containing the data read. It must be copied
///        immediately.
/// @param len Amount of bytes that must be read from `buffer`
/// @param from_stdout This is true if data was read from the job's stdout,
///        false if it came from stderr.
typedef void (*job_read_cb)(int id,
                            void *data,
                            char *buffer,
                            uint32_t len,
                            bool from_stdout);

/// Initializes job control resources
void job_init(void);

/// Releases job control resources and terminates running jobs
void job_teardown(void);

/// Tries to start a new job.
///
/// @param argv Argument vector for the process. The first item is the
///        executable to run.
/// @param data Caller data that will be associated with the job
/// @param cb Callback that will be invoked everytime data is available in
///        the job's stdout/stderr
/// @return The job id if the job started successfully. If the the first item /
///         of `argv`(the program) could not be executed, -1 will be returned.
//          0 will be returned if the job table is full.
int job_start(char **argv, void *data, job_read_cb cb);

/// Terminates a job. This is a non-blocking operation, but if the job exists
/// it's guaranteed to succeed(SIGKILL will eventually be sent)
/// 
/// @param id The job id
/// @return true if the stop request was successfully sent, false if the job
///              id is invalid(probably because it has already stopped)
bool job_stop(int id);

/// Writes data to the job's stdin. This is a non-blocking operation, it
/// returns when the write request was sent.
///
/// @param id The job id
/// @param data Buffer containing the data to be written
/// @param len Size of the data
/// @return true if the write request was successfully sent, false if the job
///              id is invalid(probably because it has already stopped)
bool job_write(int id, char *data, uint32_t len);

/// Runs the read callback associated with the job/event
///
/// @param event Object containing data necessary to invoke the callback
void job_handle(Event event);

#endif  // NEOVIM_OS_JOB_H