diff options
author | bptato <nincsnevem662@gmail.com> | 2024-03-14 22:01:04 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-03-14 22:01:04 +0100 |
commit | 96aafe1e56639e4409fb0746d740bf1ca440ba2c (patch) | |
tree | 1903c42d6610b6d70a4bf99bb3674fe31021162f | |
parent | 515f896ae2182595876ae6510c7af3651605fab5 (diff) | |
download | chawan-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.nim | 20 | ||||
-rw-r--r-- | src/local/container.nim | 3 | ||||
-rw-r--r-- | src/local/pager.nim | 24 |
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) |