diff options
author | bptato <nincsnevem662@gmail.com> | 2023-12-21 21:56:46 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2023-12-21 23:17:00 +0100 |
commit | 2e1f31470dd0bd092f2ebcbda9ddcdaa3067beb7 (patch) | |
tree | 432207cf29737cac561c3b3fff187d52f3c3f5e0 /src/server | |
parent | aad2c9860410cdbe0a80b48aba74437994cfd3e1 (diff) | |
download | chawan-2e1f31470dd0bd092f2ebcbda9ddcdaa3067beb7.tar.gz |
buffer: clean up ssock on being killed
* use signal handlers to avoid littering tmpdir with dead sockets * add connection reset error (for socketstream) * convert some imports to new style
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/buffer.nim | 41 | ||||
-rw-r--r-- | src/server/forkserver.nim | 17 |
2 files changed, 37 insertions, 21 deletions
diff --git a/src/server/buffer.nim b/src/server/buffer.nim index 49624fb8..1c5f5ea2 100644 --- a/src/server/buffer.nim +++ b/src/server/buffer.nim @@ -1,13 +1,13 @@ -import macros -import nativesockets -import net -import options -import os -import posix -import selectors -import streams -import tables -import unicode +import std/macros +import std/nativesockets +import std/net +import std/options +import std/os +import std/posix +import std/selectors +import std/streams +import std/tables +import std/unicode import bindings/quickjs import config/config @@ -119,6 +119,7 @@ type hovertext: array[HoverType, string] estream: Stream # error stream ishtml: bool + ssock: ServerSocket InterfaceOpaque = ref object stream: Stream @@ -995,6 +996,7 @@ proc clone*(buffer: Buffer, newurl: URL): Pid {.proxy.} = buffer.istream = newPosixStream(pipefd_write[0]) buffer.pstream.close() let ssock = initServerSocket(buffered = false) + buffer.ssock = ssock ps.write(char(0)) buffer.source.location = newurl for it in buffer.tasks.mitems: @@ -1730,7 +1732,7 @@ proc handleRead(buffer: Buffer, fd: int) = if fd == buffer.rfd: try: buffer.readCommand() - except EOFError: + except ErrorConnectionReset, EOFError: #eprint "EOF error", $buffer.url & "\nMESSAGE:", # getCurrentExceptionMsg() & "\n", # getStackTrace(getCurrentException()) @@ -1785,6 +1787,12 @@ proc runBuffer(buffer: Buffer) = buffer.do_reshape() buffer.loader.unregistered.setLen(0) +proc cleanup(buffer: Buffer) = + buffer.pstream.close() + buffer.ssock.close() + buffer.loader.unref() + +var gbuffer: Buffer proc launchBuffer*(config: BufferConfig, source: BufferSource, attrs: WindowAttributes, loader: FileLoader, ssock: ServerSocket) = let socks = ssock.acceptSocketStream() @@ -1802,8 +1810,13 @@ proc launchBuffer*(config: BufferConfig, source: BufferSource, selector: newSelector[int](), estream: newFileStream(stderr), pstream: socks, - rfd: int(socks.source.getFd()) + rfd: int(socks.source.getFd()), + ssock: ssock ) + gbuffer = buffer + onSignal SIGTERM, SIGINT: + discard sig + gbuffer.cleanup() buffer.srenderer = newStreamRenderer(buffer.sstream, buffer.charsets) loader.registerFun = proc(fd: int) = buffer.selector.registerHandle(fd, {Read}, 0) @@ -1814,7 +1827,5 @@ proc launchBuffer*(config: BufferConfig, source: BufferSource, buffer.attrs, proc(url: URL) = buffer.navigate(url), some(buffer.loader)) buffer.selector.registerHandle(buffer.rfd, {Read}, 0) buffer.runBuffer() - buffer.pstream.close() - buffer.loader.unref() - ssock.close() + buffer.cleanup() quit(0) diff --git a/src/server/forkserver.nim b/src/server/forkserver.nim index 7da7d3f6..79fa2ed1 100644 --- a/src/server/forkserver.nim +++ b/src/server/forkserver.nim @@ -1,9 +1,7 @@ -import options -import streams -import tables - -when defined(posix): - import posix +import std/options +import std/posix +import std/streams +import std/tables import config/config import display/winattrs @@ -103,6 +101,7 @@ proc forkLoader(ctx: var ForkServerContext, config: LoaderConfig): Pid = discard close(pipefd[0]) return pid +var gssock: ServerSocket proc forkBuffer(ctx: var ForkServerContext): Pid = var source: BufferSource var config: BufferConfig @@ -127,6 +126,12 @@ proc forkBuffer(ctx: var ForkServerContext): Pid = zeroMem(addr ctx, sizeof(ctx)) discard close(pipefd[0]) # close read let ssock = initServerSocket(buffered = false) + gssock = ssock + onSignal SIGTERM, SIGINT: + # This will be overridden after buffer has been set up; it is only + # necessary to avoid a race condition when buffer is killed before that. + discard sig + gssock.close() let ps = newPosixStream(pipefd[1]) ps.write(char(0)) ps.close() |