aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/event/loop.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2017-09-03 14:31:38 +0200
committerJustin M. Keyes <justinkz@gmail.com>2017-09-05 15:01:07 +0200
commitc00a33ed19c1372bf5880e2f32adf37c9bea165b (patch)
tree95c0ae33cd746b9c7d4acd8af9b22311057c477c /src/nvim/event/loop.c
parentff32bacb2e9781f5589eea1056e193897b0f964e (diff)
downloadrneovim-c00a33ed19c1372bf5880e2f32adf37c9bea165b.tar.gz
rneovim-c00a33ed19c1372bf5880e2f32adf37c9bea165b.tar.bz2
rneovim-c00a33ed19c1372bf5880e2f32adf37c9bea165b.zip
eventloop: loop_schedule_deferred()
Generalize the "schedule schedule" technique.
Diffstat (limited to 'src/nvim/event/loop.c')
-rw-r--r--src/nvim/event/loop.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index cc9088f776..570db6dfc3 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -74,6 +74,24 @@ void loop_schedule(Loop *loop, Event event)
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)
{
Loop *loop = data;