aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/event
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-09-28 11:56:08 +0200
committerbfredl <bjorn.linse@gmail.com>2024-09-28 20:23:22 +0200
commit76163590f0b1a39e281446b6b6b17d00b0dcae15 (patch)
treeb28b26aacb9a71348ba60ba375d246d869ca09bb /src/nvim/event
parentd5f6f61879bac3ac90512efe05d68e3500125a08 (diff)
downloadrneovim-76163590f0b1a39e281446b6b6b17d00b0dcae15.tar.gz
rneovim-76163590f0b1a39e281446b6b6b17d00b0dcae15.tar.bz2
rneovim-76163590f0b1a39e281446b6b6b17d00b0dcae15.zip
refactor(event): change last use of klist to kvec
loop->children might have been a linked list because used to be modified in place while looped over. However the loops that exists rather schedules events to be processed later, outside of the loop, so this can not happen anymore. When a linked list is otherwise useful it is better to use lib/queue_defs.h which defines an _intrusive_ linked list (i e it doesn't need to do allocations for list items like klist ).
Diffstat (limited to 'src/nvim/event')
-rw-r--r--src/nvim/event/loop.c4
-rw-r--r--src/nvim/event/loop.h9
-rw-r--r--src/nvim/event/proc.c29
3 files changed, 20 insertions, 22 deletions
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index e1ebcecbd6..15d993cc62 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -20,7 +20,7 @@ void loop_init(Loop *loop, void *data)
loop->recursive = 0;
loop->closing = false;
loop->uv.data = loop;
- loop->children = kl_init(WatcherPtr);
+ kv_init(loop->children);
loop->events = multiqueue_new_parent(loop_on_put, loop);
loop->fast_events = multiqueue_new_child(loop->events);
loop->thread_events = multiqueue_new_parent(NULL, NULL);
@@ -187,7 +187,7 @@ bool loop_close(Loop *loop, bool wait)
multiqueue_free(loop->fast_events);
multiqueue_free(loop->thread_events);
multiqueue_free(loop->events);
- kl_destroy(WatcherPtr, loop->children);
+ kv_destroy(loop->children);
return rv;
}
diff --git a/src/nvim/event/loop.h b/src/nvim/event/loop.h
index b86e83de3c..563b254a0b 100644
--- a/src/nvim/event/loop.h
+++ b/src/nvim/event/loop.h
@@ -3,15 +3,10 @@
#include <stdbool.h>
#include <uv.h>
-#include "klib/klist.h"
+#include "klib/kvec.h"
#include "nvim/event/defs.h" // IWYU pragma: keep
#include "nvim/types_defs.h" // IWYU pragma: keep
-typedef void *WatcherPtr;
-
-#define NOOP(x)
-KLIST_INIT(WatcherPtr, WatcherPtr, NOOP)
-
struct loop {
uv_loop_t uv;
MultiQueue *events;
@@ -27,7 +22,7 @@ struct loop {
MultiQueue *fast_events;
// used by process/job-control subsystem
- klist_t(WatcherPtr) *children;
+ kvec_t(Proc *) children;
uv_signal_t children_watcher;
uv_timer_t children_kill_timer;
diff --git a/src/nvim/event/proc.c b/src/nvim/event/proc.c
index 808bf794f0..5ae3bd8c2d 100644
--- a/src/nvim/event/proc.c
+++ b/src/nvim/event/proc.c
@@ -3,7 +3,6 @@
#include <signal.h>
#include <uv.h>
-#include "klib/klist.h"
#include "nvim/event/libuv_proc.h"
#include "nvim/event/loop.h"
#include "nvim/event/multiqueue.h"
@@ -123,7 +122,7 @@ int proc_spawn(Proc *proc, bool in, bool out, bool err)
proc->internal_exit_cb = on_proc_exit;
proc->internal_close_cb = decref;
proc->refcount++;
- kl_push(WatcherPtr, proc->loop->children, proc);
+ kv_push(proc->loop->children, proc);
DLOG("new: pid=%d exepath=[%s]", proc->pid, proc_get_exepath(proc));
return 0;
}
@@ -131,8 +130,8 @@ int proc_spawn(Proc *proc, bool in, bool out, bool err)
void proc_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL
{
proc_is_tearing_down = true;
- kl_iter(WatcherPtr, loop->children, current) {
- Proc *proc = (*current)->data;
+ for (size_t i = 0; i < kv_size(loop->children); i++) {
+ Proc *proc = kv_A(loop->children, i);
if (proc->detach || proc->type == kProcTypePty) {
// Close handles to process without killing it.
CREATE_EVENT(loop->events, proc_close_handles, proc);
@@ -143,7 +142,7 @@ void proc_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL
// Wait until all children exit and all close events are processed.
LOOP_PROCESS_EVENTS_UNTIL(loop, loop->events, -1,
- kl_empty(loop->children) && multiqueue_empty(loop->events));
+ kv_size(loop->children) == 0 && multiqueue_empty(loop->events));
pty_proc_teardown(loop);
}
@@ -254,8 +253,8 @@ static void children_kill_cb(uv_timer_t *handle)
{
Loop *loop = handle->loop->data;
- kl_iter(WatcherPtr, loop->children, current) {
- Proc *proc = (*current)->data;
+ for (size_t i = 0; i < kv_size(loop->children); i++) {
+ Proc *proc = kv_A(loop->children, i);
bool exited = (proc->status >= 0);
if (exited || !proc->stopped_time) {
continue;
@@ -294,15 +293,19 @@ static void decref(Proc *proc)
}
Loop *loop = proc->loop;
- kliter_t(WatcherPtr) **node = NULL;
- kl_iter(WatcherPtr, loop->children, current) {
- if ((*current)->data == proc) {
- node = current;
+ size_t i;
+ for (i = 0; i < kv_size(loop->children); i++) {
+ Proc *current = kv_A(loop->children, i);
+ if (current == proc) {
break;
}
}
- assert(node);
- kl_shift_at(WatcherPtr, loop->children, node);
+ assert(i < kv_size(loop->children)); // element found
+ if (i < kv_size(loop->children) - 1) {
+ memmove(&kv_A(loop->children, i), &kv_A(loop->children, i + 1),
+ sizeof(&kv_A(loop->children, i)) * (kv_size(loop->children) - (i + 1)));
+ }
+ kv_size(loop->children)--;
CREATE_EVENT(proc->events, proc_close_event, proc);
}