diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/js/40_spawn.js | 34 | ||||
-rw-r--r-- | runtime/ops/spawn.rs | 2 |
2 files changed, 32 insertions, 4 deletions
diff --git a/runtime/js/40_spawn.js b/runtime/js/40_spawn.js index 54914dc09..a00b8cfda 100644 --- a/runtime/js/40_spawn.js +++ b/runtime/js/40_spawn.js @@ -13,10 +13,13 @@ TypeError, Uint8Array, PromiseAll, + SymbolFor, } = window.__bootstrap.primordials; const { readableStreamForRid, writableStreamForRid } = window.__bootstrap.streamUtils; + const promiseIdSymbol = SymbolFor("Deno.core.internalPromiseId"); + function spawnChild(command, { args = [], cwd = undefined, @@ -71,6 +74,7 @@ class Child { #rid; + #waitPromiseId; #pid; get pid() { @@ -85,6 +89,8 @@ return this.#stdin; } + #stdoutPromiseId; + #stdoutRid; #stdout = null; get stdout() { if (this.#stdout == null) { @@ -93,6 +99,8 @@ return this.#stdout; } + #stderrPromiseId; + #stderrRid; #stderr = null; get stderr() { if (this.#stderr == null) { @@ -121,17 +129,25 @@ } if (stdoutRid !== null) { - this.#stdout = readableStreamForRid(stdoutRid); + this.#stdoutRid = stdoutRid; + this.#stdout = readableStreamForRid(stdoutRid, (promise) => { + this.#stdoutPromiseId = promise[promiseIdSymbol]; + }); } if (stderrRid !== null) { - this.#stderr = readableStreamForRid(stderrRid); + this.#stderrRid = stderrRid; + this.#stderr = readableStreamForRid(stderrRid, (promise) => { + this.#stderrPromiseId = promise[promiseIdSymbol]; + }); } const onAbort = () => this.kill("SIGTERM"); signal?.[add](onAbort); - this.#status = core.opAsync("op_spawn_wait", this.#rid).then((res) => { + const waitPromise = core.opAsync("op_spawn_wait", this.#rid); + this.#waitPromiseId = waitPromise[promiseIdSymbol]; + this.#status = waitPromise.then((res) => { this.#rid = null; signal?.[remove](onAbort); return res; @@ -186,6 +202,18 @@ } core.opSync("op_kill", this.#pid, signo); } + + ref() { + core.refOp(this.#waitPromiseId); + if (this.#stdoutPromiseId) core.refOp(this.#stdoutPromiseId); + if (this.#stderrPromiseId) core.refOp(this.#stderrPromiseId); + } + + unref() { + core.unrefOp(this.#waitPromiseId); + if (this.#stdoutPromiseId) core.unrefOp(this.#stdoutPromiseId); + if (this.#stderrPromiseId) core.unrefOp(this.#stderrPromiseId); + } } function spawn(command, options) { diff --git a/runtime/ops/spawn.rs b/runtime/ops/spawn.rs index a6930b485..b337f2488 100644 --- a/runtime/ops/spawn.rs +++ b/runtime/ops/spawn.rs @@ -76,7 +76,7 @@ pub struct ChildStatus { signal: Option<String>, } -impl TryFrom<std::process::ExitStatus> for ChildStatus { +impl TryFrom<ExitStatus> for ChildStatus { type Error = AnyError; fn try_from(status: ExitStatus) -> Result<Self, Self::Error> { |