mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
eventloop: loop_schedule_deferred()
Generalize the "schedule schedule" technique.
This commit is contained in:
@@ -5,7 +5,6 @@
|
|||||||
#include "nvim/fileio.h"
|
#include "nvim/fileio.h"
|
||||||
#include "nvim/vim.h"
|
#include "nvim/vim.h"
|
||||||
#include "nvim/main.h"
|
#include "nvim/main.h"
|
||||||
#include "nvim/screen.h"
|
|
||||||
#include "nvim/ui.h"
|
#include "nvim/ui.h"
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
@@ -18,16 +17,12 @@ static void focusgained_event(void **argv)
|
|||||||
do_autocmd_focusgained(*gainedp);
|
do_autocmd_focusgained(*gainedp);
|
||||||
xfree(gainedp);
|
xfree(gainedp);
|
||||||
}
|
}
|
||||||
static void schedule_event(void **argv)
|
|
||||||
{
|
|
||||||
bool *gainedp = argv[0];
|
|
||||||
multiqueue_put(main_loop.events, focusgained_event, 1, gainedp);
|
|
||||||
}
|
|
||||||
void aucmd_schedule_focusgained(bool gained)
|
void aucmd_schedule_focusgained(bool gained)
|
||||||
{
|
{
|
||||||
bool *gainedp = xmalloc(sizeof(*gainedp));
|
bool *gainedp = xmalloc(sizeof(*gainedp));
|
||||||
*gainedp = gained;
|
*gainedp = gained;
|
||||||
loop_schedule(&main_loop, event_create(schedule_event, 1, gainedp));
|
loop_schedule_deferred(&main_loop,
|
||||||
|
event_create(focusgained_event, 1, gainedp));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_autocmd_focusgained(bool gained)
|
static void do_autocmd_focusgained(bool gained)
|
||||||
|
@@ -74,6 +74,24 @@ void loop_schedule(Loop *loop, Event event)
|
|||||||
uv_mutex_unlock(&loop->mutex);
|
uv_mutex_unlock(&loop->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Schedules an event from another thread. Unlike loop_schedule(), the event
|
||||||
|
/// is forwarded to `Loop.events`, instead of being processed immediately.
|
||||||
|
///
|
||||||
|
/// @see loop_schedule
|
||||||
|
void loop_schedule_deferred(Loop *loop, Event event)
|
||||||
|
{
|
||||||
|
Event *eventp = xmalloc(sizeof(*eventp));
|
||||||
|
*eventp = event;
|
||||||
|
loop_schedule(loop, event_create(loop_deferred_event, 2, loop, eventp));
|
||||||
|
}
|
||||||
|
static void loop_deferred_event(void **argv)
|
||||||
|
{
|
||||||
|
Loop *loop = argv[0];
|
||||||
|
Event *eventp = argv[1];
|
||||||
|
multiqueue_put_event(loop->events, *eventp);
|
||||||
|
xfree(eventp);
|
||||||
|
}
|
||||||
|
|
||||||
void loop_on_put(MultiQueue *queue, void *data)
|
void loop_on_put(MultiQueue *queue, void *data)
|
||||||
{
|
{
|
||||||
Loop *loop = data;
|
Loop *loop = data;
|
||||||
|
Reference in New Issue
Block a user