diff options
-rw-r--r-- | src/loader/loader.nim | 13 | ||||
-rw-r--r-- | src/local/client.nim | 3 | ||||
-rw-r--r-- | src/local/container.nim | 3 | ||||
-rw-r--r-- | src/local/pager.nim | 6 | ||||
-rw-r--r-- | src/server/buffer.nim | 3 |
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 |