about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-03-14 22:01:04 +0100
committerbptato <nincsnevem662@gmail.com>2024-03-14 22:01:04 +0100
commit96aafe1e56639e4409fb0746d740bf1ca440ba2c (patch)
tree1903c42d6610b6d70a4bf99bb3674fe31021162f
parent515f896ae2182595876ae6510c7af3651605fab5 (diff)
downloadchawan-96aafe1e56639e4409fb0746d740bf1ca440ba2c.tar.gz
pager: unregister containers properly when headers are pending
It can happen that a container is deleted before it acquires a buffer
process; add it to the `unreg' array in this case too.
-rw-r--r--src/local/client.nim20
-rw-r--r--src/local/container.nim3
-rw-r--r--src/local/pager.nim24
3 files changed, 33 insertions, 14 deletions
diff --git a/src/local/client.nim b/src/local/client.nim
index bc52f704..31acce49 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -462,14 +462,22 @@ proc consoleBuffer(client: Client): Container {.jsfget.} =
 proc acceptBuffers(client: Client) =
   let pager = client.pager
   while pager.unreg.len > 0:
-    let (pid, stream) = pager.unreg.pop()
-    let fd = int(stream.source.fd)
-    if fd in client.fdmap:
+    let container = pager.unreg.pop()
+    if container.iface != nil: # fully connected
+      let stream = container.iface.stream
+      let fd = int(stream.source.fd)
       client.selector.unregister(fd)
       client.fdmap.del(fd)
-    else:
-      pager.procmap.del(pid)
-    stream.close()
+      stream.close()
+    elif container.process != -1: # connecting to buffer process
+      let i = pager.findProcMapItem(container.process)
+      pager.procmap.del(i)
+    else: # connecting to URL
+      let i = pager.findConnectingContainer(container)
+      let stream = pager.connectingContainers[i].stream
+      client.selector.unregister(stream.fd)
+      stream.close()
+      pager.connectingContainers.del(i)
   let registerFun = proc(fd: int) =
     client.selector.unregister(fd)
     client.selector.registerHandle(fd, {Read, Write}, 0)
diff --git a/src/local/container.nim b/src/local/container.nim
index e2d84ac0..6661380f 100644
--- a/src/local/container.nim
+++ b/src/local/container.nim
@@ -169,7 +169,8 @@ proc newContainer*(config: BufferConfig; url: URL; request: Request;
     canreinterpret: canreinterpret,
     loadinfo: "Connecting to " & request.url.host & "...",
     cacheId: cacheId,
-    cacheFile: cacheFile
+    cacheFile: cacheFile,
+    process: -1
   )
 
 func location(container: Container): URL {.jsfget.} =
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 7502cb00..bc17f8fa 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -16,7 +16,6 @@ import config/chapath
 import config/config
 import config/mailcap
 import config/mimetypes
-import io/bufstream
 import io/posixstream
 import io/promise
 import io/serialize
@@ -37,7 +36,6 @@ import local/container
 import local/lineedit
 import local/select
 import local/term
-import server/buffer
 import server/forkserver
 import types/cell
 import types/color
@@ -75,7 +73,7 @@ type
   ConnectingContainerItem = ref object
     state: ContainerConnectionState
     container: Container
-    stream: SocketStream
+    stream*: SocketStream
     res: int
     outputId: int
     status: uint16
@@ -90,7 +88,7 @@ type
     cgiDir*: seq[string]
     commandMode {.jsget.}: bool
     config: Config
-    connectingContainers: seq[ConnectingContainerItem]
+    connectingContainers*: seq[ConnectingContainerItem]
     container*: Container
     cookiejars: Table[string, CookieJar]
     devRandom: PosixStream
@@ -120,7 +118,7 @@ type
     statusgrid*: FixedGrid
     term*: Terminal
     tmpdir*: string
-    unreg*: seq[tuple[pid: int; stream: BufStream]]
+    unreg*: seq[Container]
     urimethodmap: URIMethodMap
     username: string
 
@@ -579,6 +577,18 @@ func findConnectingContainer*(pager: Pager; fd: int): int =
       return i
   -1
 
+func findConnectingContainer*(pager: Pager; container: Container): int =
+  for i, item in pager.connectingContainers:
+    if item.container == container:
+      return i
+  -1
+
+func findProcMapItem*(pager: Pager; pid: int): int =
+  for i, item in pager.procmap:
+    if item.container.process == pid:
+      return i
+  -1
+
 proc dupeBuffer(pager: Pager, container: Container, url: URL) =
   container.clone(url).then(proc(container: Container) =
     if container == nil:
@@ -726,8 +736,8 @@ proc deleteContainer(pager: Pager; container: Container) =
   if container.replace != nil:
     pager.replace(container, container.replace)
     container.replace = nil
-  if container.iface != nil:
-    pager.unreg.add((container.process, container.iface.stream))
+  pager.unreg.add(container)
+  if container.process != -1:
     pager.forkserver.removeChild(container.process)
     pager.loader.removeClient(container.process)