aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/input.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-07-08 13:08:29 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-07-17 11:37:42 -0300
commit2e4ea29d2c7b62eb8baf1c41cd43433e085dda0f (patch)
tree5f43aacf9a42b18e02c9873d18a4549c6b7cb2c1 /src/nvim/os/input.c
parentcf30837951120bb27563054ab9aadd4ccf6fadbf (diff)
downloadrneovim-2e4ea29d2c7b62eb8baf1c41cd43433e085dda0f.tar.gz
rneovim-2e4ea29d2c7b62eb8baf1c41cd43433e085dda0f.tar.bz2
rneovim-2e4ea29d2c7b62eb8baf1c41cd43433e085dda0f.zip
events: Refactor how event deferral is handled
- Remove all *_set_defer methods and the 'defer' flag from rstream/jobs - Added {signal,rstream,job}_event_source functions. Each return a pointer that represent the event source for the object in question(For signals, a static pointer is returned) - Added a 'source' field to the Event struct, which is set to the appropriate value by the code that created the event. - Added a 'sources' parameter to `event_poll`. It should point to a NULL-terminated array of event sources that will be used to decide which events should be processed immediately - Added a 'source_override' parameter to `rstream_new`. This was required to use jobs as event sources of RStream instances(When "focusing" on a job, for example). - Extracted `process_from` static function from `event_process`. - Remove 'defer' parameter from `event_process`, which now operates only on deferred events. - Refactor `channel_send_call` to use the new lock mechanism What changed in a single sentence: Code that calls `event_poll` have to specify which event sources should NOT be deferred. This change was necessary for a number of reasons: - To fix a bug where due to race conditions, a client request could end in the deferred queue in the middle of a `channel_send_call` invocation, resulting in a deadlock since the client process would never receive a response, and channel_send_call would never return because the client would still be waiting for the response. - To handle "event locking" correctly in recursive `channel_send_call` invocations when the frames are waiting for responses from different clients. Not much of an issue now since there's only a python client, but could break things later. - To simplify the process of implementing synchronous functions that depend on asynchronous events.
Diffstat (limited to 'src/nvim/os/input.c')
-rw-r--r--src/nvim/os/input.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index 58bdf0cf52..15aebdbf3d 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -34,7 +34,7 @@ static bool eof = false, started_reading = false;
void input_init(void)
{
- read_stream = rstream_new(read_cb, READ_BUFFER_SIZE, NULL, false);
+ read_stream = rstream_new(read_cb, READ_BUFFER_SIZE, NULL, NULL);
rstream_set_file(read_stream, read_cmd_fd);
}
@@ -129,7 +129,12 @@ bool os_isatty(int fd)
static bool input_poll(int32_t ms)
{
- return input_ready() || event_poll(ms) || input_ready();
+ EventSource input_sources[] = {
+ rstream_event_source(read_stream),
+ NULL
+ };
+
+ return input_ready() || event_poll(ms, input_sources) || input_ready();
}
// This is a replacement for the old `WaitForChar` function in os_unix.c