mirror of
https://github.com/neovim/neovim.git
synced 2025-09-08 12:28:18 +00:00
api/nvim_get_mode: Use child-queue instead of "priority".
This commit is contained in:
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
#include "nvim/api/vim.h"
|
#include "nvim/api/vim.h"
|
||||||
#include "nvim/ascii.h"
|
#include "nvim/ascii.h"
|
||||||
#include "nvim/log.h"
|
|
||||||
#include "nvim/api/private/helpers.h"
|
#include "nvim/api/private/helpers.h"
|
||||||
#include "nvim/api/private/defs.h"
|
#include "nvim/api/private/defs.h"
|
||||||
#include "nvim/api/buffer.h"
|
#include "nvim/api/buffer.h"
|
||||||
|
@@ -55,7 +55,6 @@
|
|||||||
|
|
||||||
#include "nvim/event/multiqueue.h"
|
#include "nvim/event/multiqueue.h"
|
||||||
#include "nvim/memory.h"
|
#include "nvim/memory.h"
|
||||||
#include "nvim/log.h"
|
|
||||||
#include "nvim/os/time.h"
|
#include "nvim/os/time.h"
|
||||||
|
|
||||||
typedef struct multiqueue_item MultiQueueItem;
|
typedef struct multiqueue_item MultiQueueItem;
|
||||||
|
@@ -28,7 +28,6 @@
|
|||||||
#include "nvim/map.h"
|
#include "nvim/map.h"
|
||||||
#include "nvim/log.h"
|
#include "nvim/log.h"
|
||||||
#include "nvim/misc1.h"
|
#include "nvim/misc1.h"
|
||||||
#include "nvim/state.h"
|
|
||||||
#include "nvim/lib/kvec.h"
|
#include "nvim/lib/kvec.h"
|
||||||
#include "nvim/os/input.h"
|
#include "nvim/os/input.h"
|
||||||
|
|
||||||
@@ -91,6 +90,7 @@ static msgpack_sbuffer out_buffer;
|
|||||||
/// Initializes the module
|
/// Initializes the module
|
||||||
void channel_init(void)
|
void channel_init(void)
|
||||||
{
|
{
|
||||||
|
ch_before_blocking_events = multiqueue_new_child(main_loop.events);
|
||||||
channels = pmap_new(uint64_t)();
|
channels = pmap_new(uint64_t)();
|
||||||
event_strings = pmap_new(cstr_t)();
|
event_strings = pmap_new(cstr_t)();
|
||||||
msgpack_sbuffer_init(&out_buffer);
|
msgpack_sbuffer_init(&out_buffer);
|
||||||
@@ -446,9 +446,8 @@ static void handle_request(Channel *channel, msgpack_object *request)
|
|||||||
&& !strncmp("nvim_get_mode", method->via.bin.ptr, method->via.bin.size);
|
&& !strncmp("nvim_get_mode", method->via.bin.ptr, method->via.bin.size);
|
||||||
|
|
||||||
if (is_get_mode && !input_blocking()) {
|
if (is_get_mode && !input_blocking()) {
|
||||||
// Schedule on the main loop with special priority. #6247
|
// Defer the event to a special queue used by os/input.c. #6247
|
||||||
Event ev = event_create(kEvPriorityAsync, on_request_event, 1, evdata);
|
multiqueue_put(ch_before_blocking_events, on_request_event, 1, evdata);
|
||||||
multiqueue_put_event(channel->events, ev);
|
|
||||||
} else {
|
} else {
|
||||||
// Invoke immediately.
|
// Invoke immediately.
|
||||||
on_request_event((void **)&evdata);
|
on_request_event((void **)&evdata);
|
||||||
|
@@ -11,6 +11,11 @@
|
|||||||
|
|
||||||
#define METHOD_MAXLEN 512
|
#define METHOD_MAXLEN 512
|
||||||
|
|
||||||
|
/// HACK: os/input.c drains this queue immediately before blocking for input.
|
||||||
|
/// Events on this queue are async-safe, but they need the resolved state
|
||||||
|
/// of os_inchar(), so they are processed "just-in-time".
|
||||||
|
MultiQueue *ch_before_blocking_events;
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "msgpack_rpc/channel.h.generated.h"
|
# include "msgpack_rpc/channel.h.generated.h"
|
||||||
#endif
|
#endif
|
||||||
|
@@ -14,7 +14,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "nvim/vim.h"
|
#include "nvim/vim.h"
|
||||||
#include "nvim/log.h"
|
|
||||||
#include "nvim/ascii.h"
|
#include "nvim/ascii.h"
|
||||||
#include "nvim/normal.h"
|
#include "nvim/normal.h"
|
||||||
#include "nvim/buffer.h"
|
#include "nvim/buffer.h"
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
#include "nvim/main.h"
|
#include "nvim/main.h"
|
||||||
#include "nvim/misc1.h"
|
#include "nvim/misc1.h"
|
||||||
#include "nvim/state.h"
|
#include "nvim/state.h"
|
||||||
#include "nvim/log.h"
|
#include "nvim/msgpack_rpc/channel.h"
|
||||||
|
|
||||||
#define READ_BUFFER_SIZE 0xfff
|
#define READ_BUFFER_SIZE 0xfff
|
||||||
#define INPUT_BUFFER_SIZE (READ_BUFFER_SIZE * 4)
|
#define INPUT_BUFFER_SIZE (READ_BUFFER_SIZE * 4)
|
||||||
@@ -342,11 +342,9 @@ static bool input_poll(int ms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((ms == - 1 || ms > 0) && !events_enabled && !input_eof) {
|
if ((ms == - 1 || ms > 0) && !events_enabled && !input_eof) {
|
||||||
// We have discovered that the pending input will provoke a blocking wait.
|
// The pending input provoked a blocking wait. Do special events now. #6247
|
||||||
// Process any events marked with priority `kEvPriorityAsync`: these events
|
|
||||||
// must be handled after flushing input. See channel.c:handle_request #6247
|
|
||||||
blocking = true;
|
blocking = true;
|
||||||
multiqueue_process_priority(main_loop.events, kEvPriorityAsync);
|
multiqueue_process_events(ch_before_blocking_events);
|
||||||
}
|
}
|
||||||
LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, ms, input_ready() || input_eof);
|
LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, ms, input_ready() || input_eof);
|
||||||
blocking = false;
|
blocking = false;
|
||||||
|
Reference in New Issue
Block a user