about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/loader/loader.nim13
-rw-r--r--src/local/client.nim3
-rw-r--r--src/local/container.nim3
-rw-r--r--src/local/pager.nim6
-rw-r--r--src/server/buffer.nim3
5 files changed, 20 insertions, 8 deletions
diff --git a/src/loader/loader.nim b/src/loader/loader.nim
index f773936f..955529d9 100644
--- a/src/loader/loader.nim
+++ b/src/loader/loader.nim
@@ -524,14 +524,22 @@ proc addClient(ctx: LoaderContext; stream: SocketStream;
   var key: ClientKey
   var pid: int
   var config: LoaderClientConfig
+  var clonedFrom: int
   r.sread(key)
   r.sread(pid)
   r.sread(config)
+  r.sread(clonedFrom)
   stream.withPacketWriter w:
     if pid in ctx.clientData or key == default(ClientKey):
       w.swrite(false)
     else:
-      ctx.clientData[pid] = ClientData(pid: pid, key: key, config: config)
+      let client = ClientData(pid: pid, key: key, config: config)
+      ctx.clientData[pid] = client
+      if clonedFrom != -1:
+        let client2 = ctx.clientData[clonedFrom]
+        for item in client2.cacheMap:
+          inc item.refc
+        client.cacheMap = client2.cacheMap
       w.swrite(true)
   stream.sclose()
 
@@ -1138,13 +1146,14 @@ proc removeCachedItem*(loader: FileLoader; cacheId: int) =
     stream.sclose()
 
 proc addClient*(loader: FileLoader; key: ClientKey; pid: int;
-    config: LoaderClientConfig): bool =
+    config: LoaderClientConfig; clonedFrom: int): bool =
   let stream = loader.connect()
   stream.withLoaderPacketWriter loader, w:
     w.swrite(lcAddClient)
     w.swrite(key)
     w.swrite(pid)
     w.swrite(config)
+    w.swrite(clonedFrom)
   var r = stream.initPacketReader()
   r.sread(result)
   stream.sclose()
diff --git a/src/local/client.nim b/src/local/client.nim
index 60910bc8..97390528 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -406,7 +406,8 @@ proc acceptBuffers(client: Client) =
     if stream == nil:
       pager.alert("Error: failed to set up buffer")
       continue
-    let key = pager.addLoaderClient(container.process, container.loaderConfig)
+    let key = pager.addLoaderClient(container.process, container.loaderConfig,
+      container.clonedFrom)
     let loader = pager.loader
     stream.withPacketWriter w:
       w.swrite(key)
diff --git a/src/local/container.nim b/src/local/container.nim
index a103e7a8..9dc9d552 100644
--- a/src/local/container.nim
+++ b/src/local/container.nim
@@ -135,6 +135,7 @@ type
     bpos: seq[CursorPosition]
     highlights: seq[Highlight]
     process* {.jsget.}: int
+    clonedFrom*: int
     loadinfo*: string
     lines: SimpleFlexibleGrid
     lineshift: int
@@ -479,6 +480,7 @@ proc newContainer*(config: BufferConfig; loaderConfig: LoaderClientConfig;
     loadinfo: "Connecting to " & request.url.host & "...",
     cacheId: cacheId,
     process: -1,
+    clonedFrom: -1,
     mainConfig: mainConfig,
     flags: flags,
     luctx: luctx,
@@ -515,6 +517,7 @@ proc clone*(container: Container; newurl: URL; loader: FileLoader):
     nc[] = container[]
     nc.url = url
     nc.process = pid
+    nc.clonedFrom = container.process
     nc.flags.incl(cfCloned)
     nc.retry = @[]
     nc.parent = nil
diff --git a/src/local/pager.nim b/src/local/pager.nim
index c77d724b..6430416f 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -341,10 +341,10 @@ proc genClientKey(pager: Pager): ClientKey =
   pager.devRandom.recvDataLoop(key)
   return key
 
-proc addLoaderClient*(pager: Pager; pid: int; config: LoaderClientConfig):
-    ClientKey =
+proc addLoaderClient*(pager: Pager; pid: int; config: LoaderClientConfig;
+    clonedFrom = -1): ClientKey =
   var key = pager.genClientKey()
-  while unlikely(not pager.loader.addClient(key, pid, config)):
+  while unlikely(not pager.loader.addClient(key, pid, config, clonedFrom)):
     key = pager.genClientKey()
   return key
 
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index fa63f3a9..153ebbb6 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -906,7 +906,7 @@ proc clone*(buffer: Buffer; newurl: URL): int {.proxy.} =
       buffer.selector.close()
     when defined(freebsd) or defined(openbsd):
       # Hack necessary because newSelector calls sysctl, but Capsicum really
-      # dislikes that and we don't want to request systctl capabilities
+      # dislikes that and we don't want to request sysctl capabilities
       # from pledge either.
       #
       # To make this work we
@@ -984,7 +984,6 @@ proc clone*(buffer: Buffer; newurl: URL): int {.proxy.} =
     let c = ps.sreadChar()
     assert c == char(0)
     ps.sclose()
-    #TODO share cached images with new buffer
     buffer.loader.resume(ids)
     return pid