about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-09-03 01:17:53 +0200
committerbptato <nincsnevem662@gmail.com>2024-09-03 01:22:00 +0200
commit298684d174be90be57967f15c2f1bf0d24ba2446 (patch)
treef4cbd02fecb39b39f931bceb1b79dbc439223d0f
parent6d8c2fca2e39cc9f3cc9a99cac5584864eaa0ed4 (diff)
downloadchawan-298684d174be90be57967f15c2f1bf0d24ba2446.tar.gz
loader, client, buffer: use selectInto (not select)
select allocates. (makes sense, but I never realized...)
-rw-r--r--src/loader/loader.nim7
-rw-r--r--src/local/client.nim10
-rw-r--r--src/server/buffer.nim5
3 files changed, 13 insertions, 9 deletions
diff --git a/src/loader/loader.nim b/src/loader/loader.nim
index b655b917..c882c227 100644
--- a/src/loader/loader.nim
+++ b/src/loader/loader.nim
@@ -216,7 +216,7 @@ proc unregister(ctx: LoaderContext; output: OutputHandle) =
           f.setLen(0)
       ctx.selector.count = oc - 1
   else:
-    ctx.selector.unregister(int(output.ostream.fd))
+    ctx.selector.unregister(fd)
   output.registered = false
 
 # Either write data to the target output, or append it to the list of buffers to
@@ -953,11 +953,12 @@ proc finishCycle(ctx: LoaderContext; unregRead: var seq[LoaderHandle];
 proc runFileLoader*(fd: cint; config: LoaderConfig) =
   var ctx = initLoaderContext(fd, config)
   let fd = int(ctx.ssock.sock.getFd())
+  var keys: array[64, ReadyKey]
   while ctx.alive:
-    let events = ctx.selector.select(-1)
+    let count = ctx.selector.selectInto(-1, keys)
     var unregRead: seq[LoaderHandle] = @[]
     var unregWrite: seq[OutputHandle] = @[]
-    for event in events:
+    for event in keys.toOpenArray(0, count - 1):
       if Read in event.events:
         if event.fd == fd: # incoming connection
           ctx.acceptConnection()
diff --git a/src/local/client.nim b/src/local/client.nim
index 3d3e1bb0..02f497ff 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -545,9 +545,10 @@ proc inputLoop(client: Client) =
   selector.registerHandle(int(client.pager.term.istream.fd), {Read}, 0)
   when not defined(android):
     let sigwinch = selector.registerSignal(int(SIGWINCH), 0)
+  var keys: array[64, ReadyKey]
   while true:
-    let events = client.selector.select(-1)
-    for event in events:
+    let count = client.selector.selectInto(-1, keys)
+    for event in keys.toOpenArray(0, count - 1):
       if Read in event.events:
         client.handleRead(event.fd)
       if Write in event.events:
@@ -598,9 +599,10 @@ func hasSelectFds(client: Client): bool =
     client.pager.procmap.len > 0
 
 proc headlessLoop(client: Client) =
+  var keys: array[64, ReadyKey]
   while client.hasSelectFds():
-    let events = client.selector.select(-1)
-    for event in events:
+    let count = client.selector.selectInto(-1, keys)
+    for event in keys.toOpenArray(0, count - 1):
       if Read in event.events:
         client.handleRead(event.fd)
       if Write in event.events:
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index 3f0b3a71..7af3cae0 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -1828,9 +1828,10 @@ proc handleError(buffer: Buffer; fd: int; err: OSErrorCode): bool =
 
 proc runBuffer(buffer: Buffer) =
   var alive = true
+  var keys: array[64, ReadyKey]
   while alive:
-    let events = buffer.selector.select(-1)
-    for event in events:
+    let count = buffer.selector.selectInto(-1, keys)
+    for event in keys.toOpenArray(0, count - 1):
       if Read in event.events:
         if not buffer.handleRead(event.fd):
           alive = false