From 2e4ea29d2c7b62eb8baf1c41cd43433e085dda0f Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Tue, 8 Jul 2014 13:08:29 -0300 Subject: 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. --- src/nvim/ex_getln.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/nvim/ex_getln.c') diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 67748fa164..bf5076bdc3 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -762,7 +762,7 @@ getcmdline ( */ switch (c) { case K_EVENT: - event_process(true); + event_process(); // Force a redraw even though the command line didn't change shell_resized(); goto cmdline_not_changed; @@ -1878,7 +1878,7 @@ redraw: if (IS_SPECIAL(c1)) { // Process deferred events - event_process(true); + event_process(); // Ignore other special key codes continue; } -- cgit