diff options
author | bptato <nincsnevem662@gmail.com> | 2024-01-19 16:00:03 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-01-19 16:00:03 +0100 |
commit | ddbf590d57f60e4e6243cefc176b103e78674f88 (patch) | |
tree | 3b6cc786c000641d53bfda05601d172eaf897c53 /src/server | |
parent | 8432758f04f943d7959289d15741631dec39f7d8 (diff) | |
download | chawan-ddbf590d57f60e4e6243cefc176b103e78674f88.tar.gz |
buffer: fix clone on *BSD
kqueue does not like being closed after fork(2).
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/buffer.nim | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/server/buffer.nim b/src/server/buffer.nim index 3d4c86b7..fbeb772c 100644 --- a/src/server/buffer.nim +++ b/src/server/buffer.nim @@ -914,6 +914,12 @@ proc setContentType*(buffer: Buffer, contentType: string) {.proxy.} = buffer.source.contentType = some(contentType) buffer.ishtml = contentType == "text/html" +# As defined in std/selectors: this determines whether kqueue is being used. +# On these platforms, we must not close the selector after fork, since kqueue +# fds are not inherited after a fork. +const bsdPlatform = defined(macosx) or defined(freebsd) or defined(netbsd) or + defined(openbsd) or defined(dragonfly) + # Create an exact clone of the current buffer. # This clone will share the loader process with the previous buffer. proc clone*(buffer: Buffer, newurl: URL): Pid {.proxy.} = @@ -958,7 +964,8 @@ proc clone*(buffer: Buffer, newurl: URL): Pid {.proxy.} = # We must allocate a new selector for this new process. (Otherwise we # would interfere with operation of the other one.) # Closing seems to suffice here. - buffer.selector.close() + when not bsdPlatform: + buffer.selector.close() buffer.selector = newSelector[int]() #TODO set buffer.window.timeouts.selector var cfds: seq[int] |