mirror of
https://github.com/neovim/neovim.git
synced 2025-11-25 03:30:37 +00:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user