about summary refs log tree commit diff stats
path: root/src/local
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-03-13 18:59:43 +0100
committerbptato <nincsnevem662@gmail.com>2025-03-13 19:11:06 +0100
commitc7e0c4f634447d9fcf3201a324787f38da661890 (patch)
tree6a8176b2be4cd8dadd7d4887762d6425f4461500 /src/local
parent02f69c4da217dd8b06beaaf57d46c20ab9a1ff60 (diff)
downloadchawan-c7e0c4f634447d9fcf3201a324787f38da661890.tar.gz
forkserver: simplify & improve process cleanup
Instead of trying to track child pids (which is wrong - a child may die
at any time for whatever reason, so we could have ended up murdering
some random process that took its place...), just setsid on forkserver
start and send SIGTERM to the entire process group on termination.

Also removed the loader pid from the FileLoader object, as it is no
longer useful.
Diffstat (limited to 'src/local')
-rw-r--r--src/local/client.nim4
-rw-r--r--src/local/pager.nim8
2 files changed, 5 insertions, 7 deletions
diff --git a/src/local/client.nim b/src/local/client.nim
index e45d41f5..0918f438 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -162,13 +162,13 @@ proc newClient*(config: Config; forkserver: ForkServer; loaderPid: int;
   initCAtomFactory()
   let jsrt = JS_GetRuntime(jsctx)
   let clientPid = getCurrentProcessId()
-  let loader = newFileLoader(loaderPid, clientPid, loaderStream)
+  let loader = newFileLoader(clientPid, loaderStream)
   let client = Client(
     jsrt: jsrt,
     jsctx: jsctx,
     loader: loader,
     crypto: Crypto(urandom: urandom),
-    pager: newPager(config, forkserver, jsctx, warnings, loader),
+    pager: newPager(config, forkserver, jsctx, warnings, loader, loaderPid),
     settings: EnvironmentSettings(scripting: smApp)
   )
   client.attrsp = addr client.pager.term.attrs
diff --git a/src/local/pager.nim b/src/local/pager.nim
index ac78f8bb..13c57f2b 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -153,6 +153,7 @@ type
     lineedit*: LineEdit
     linemode: LineMode
     loader*: FileLoader
+    loaderPid {.jsget.}: int
     luctx: LUContext
     menu: Select
     navDirection {.jsget.}: NavDirection
@@ -222,9 +223,6 @@ proc updateReadLine(pager: Pager)
 template attrs(pager: Pager): WindowAttributes =
   pager.term.attrs
 
-func loaderPid(pager: Pager): int {.jsfget.} =
-  return pager.loader.loaderPid
-
 func getRoot(container: Container): Container =
   var c = container
   while c.parent != nil:
@@ -432,7 +430,7 @@ proc evalJSFree(opaque: RootRef; src, filename: string) =
   JS_FreeValue(pager.jsctx, pager.evalJS(src, filename))
 
 proc newPager*(config: Config; forkserver: ForkServer; ctx: JSContext;
-    alerts: seq[string]; loader: FileLoader): Pager =
+    alerts: seq[string]; loader: FileLoader; loaderPid: int): Pager =
   let pager = Pager(
     alive: true,
     config: config,
@@ -444,6 +442,7 @@ proc newPager*(config: Config; forkserver: ForkServer; ctx: JSContext;
     luctx: LUContext(),
     exitCode: -1,
     loader: loader,
+    loaderPid: loaderPid,
     cookieJars: newCookieJarMap()
   )
   pager.timeouts = newTimeoutState(pager.jsctx, evalJSFree, pager)
@@ -1572,7 +1571,6 @@ proc deleteContainer(pager: Pager; container, setTarget: Container) =
   pager.unreg.add(container)
   if container.process != -1:
     pager.loader.removeCachedItem(container.cacheId)
-    pager.forkserver.removeChild(container.process)
     pager.loader.removeClient(container.process)
 
 proc discardBuffer(pager: Pager; container = none(Container);