diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2019-11-13 23:14:48 -0500 |
---|---|---|
committer | Ry Dahl <ry@tinyclouds.org> | 2019-11-13 23:42:35 -0500 |
commit | fdf0ede2acd110ba04857d5674db19c908b3ff32 (patch) | |
tree | 880252cadf6dd5024fe4d32dca7ab903af55e713 /cli/ops/process.rs | |
parent | fd62379eafde6571f126df5650b80cfda9f74229 (diff) |
Revert "refactor: per-worker resource table (#3306)"
This patch does not work with the recent bundler changes (#3325).
Unfortunately I didn't merge master before landing this patch. It has
something to do with console.log not working inside the compiler worker.
This reverts commit fd62379eafde6571f126df5650b80cfda9f74229.
Diffstat (limited to 'cli/ops/process.rs')
-rw-r--r-- | cli/ops/process.rs | 98 |
1 files changed, 23 insertions, 75 deletions
diff --git a/cli/ops/process.rs b/cli/ops/process.rs index 237b02fd0..f7897ec51 100644 --- a/cli/ops/process.rs +++ b/cli/ops/process.rs @@ -1,8 +1,9 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use super::dispatch_json::{Deserialize, JsonOp, Value}; -use super::io::StreamResource; use crate::deno_error::bad_resource; use crate::ops::json_op; +use crate::resources; +use crate::resources::CloneFileFuture; use crate::signal::kill; use crate::state::ThreadSafeState; use deno::*; @@ -27,41 +28,6 @@ pub fn init(i: &mut Isolate, s: &ThreadSafeState) { i.register_op("kill", s.core_op(json_op(s.stateful_op(op_kill)))); } -struct CloneFileFuture { - rid: ResourceId, - state: ThreadSafeState, -} - -impl Future for CloneFileFuture { - type Item = tokio::fs::File; - type Error = ErrBox; - - fn poll(&mut self) -> Poll<Self::Item, Self::Error> { - let mut table = self.state.lock_resource_table(); - let repr = table - .get_mut::<StreamResource>(self.rid) - .ok_or_else(bad_resource)?; - match repr { - StreamResource::FsFile(ref mut file) => { - file.poll_try_clone().map_err(ErrBox::from) - } - _ => Err(bad_resource()), - } - } -} - -fn clone_file( - rid: u32, - state: &ThreadSafeState, -) -> Result<std::fs::File, ErrBox> { - (CloneFileFuture { - rid, - state: state.clone(), - }) - .wait() - .map(|f| f.into_std()) -} - fn subprocess_stdio_map(s: &str) -> std::process::Stdio { match s { "inherit" => std::process::Stdio::inherit(), @@ -99,7 +65,6 @@ fn op_run( let run_args: RunArgs = serde_json::from_value(args)?; state.check_run()?; - let state_ = state.clone(); let args = run_args.args; let env = run_args.env; @@ -118,7 +83,7 @@ fn op_run( // TODO: make this work with other resources, eg. sockets let stdin_rid = run_args.stdin_rid; if stdin_rid > 0 { - let file = clone_file(stdin_rid, &state_)?; + let file = (CloneFileFuture { rid: stdin_rid }).wait()?.into_std(); c.stdin(file); } else { c.stdin(subprocess_stdio_map(run_args.stdin.as_ref())); @@ -126,7 +91,7 @@ fn op_run( let stdout_rid = run_args.stdout_rid; if stdout_rid > 0 { - let file = clone_file(stdout_rid, &state_)?; + let file = (CloneFileFuture { rid: stdout_rid }).wait()?.into_std(); c.stdout(file); } else { c.stdout(subprocess_stdio_map(run_args.stdout.as_ref())); @@ -134,7 +99,7 @@ fn op_run( let stderr_rid = run_args.stderr_rid; if stderr_rid > 0 { - let file = clone_file(stderr_rid, &state_)?; + let file = (CloneFileFuture { rid: stderr_rid }).wait()?.into_std(); c.stderr(file); } else { c.stderr(subprocess_stdio_map(run_args.stderr.as_ref())); @@ -144,42 +109,29 @@ fn op_run( let mut child = c.spawn_async().map_err(ErrBox::from)?; let pid = child.id(); - let mut table = state_.lock_resource_table(); - - let stdin_rid = match child.stdin().take() { - Some(child_stdin) => { - let rid = table.add( - "childStdin", - Box::new(StreamResource::ChildStdin(child_stdin)), - ); - Some(rid) - } - None => None, + let stdin_rid = if child.stdin().is_some() { + let rid = resources::add_child_stdin(child.stdin().take().unwrap()); + Some(rid) + } else { + None }; - let stdout_rid = match child.stdout().take() { - Some(child_stdout) => { - let rid = table.add( - "childStdout", - Box::new(StreamResource::ChildStdout(child_stdout)), - ); - Some(rid) - } - None => None, + let stdout_rid = if child.stdout().is_some() { + let rid = resources::add_child_stdout(child.stdout().take().unwrap()); + Some(rid) + } else { + None }; - let stderr_rid = match child.stderr().take() { - Some(child_stderr) => { - let rid = table.add( - "childStderr", - Box::new(StreamResource::ChildStderr(child_stderr)), - ); - Some(rid) - } - None => None, + let stderr_rid = if child.stderr().is_some() { + let rid = resources::add_child_stderr(child.stderr().take().unwrap()); + Some(rid) + } else { + None }; let child_resource = ChildResource { child }; + let mut table = resources::lock_resource_table(); let child_rid = table.add("child", Box::new(child_resource)); Ok(JsonOp::Sync(json!({ @@ -193,7 +145,6 @@ fn op_run( pub struct ChildStatus { rid: ResourceId, - state: ThreadSafeState, } impl Future for ChildStatus { @@ -201,7 +152,7 @@ impl Future for ChildStatus { type Error = ErrBox; fn poll(&mut self) -> Poll<ExitStatus, ErrBox> { - let mut table = self.state.lock_resource_table(); + let mut table = resources::lock_resource_table(); let child_resource = table .get_mut::<ChildResource>(self.rid) .ok_or_else(bad_resource)?; @@ -226,10 +177,7 @@ fn op_run_status( state.check_run()?; - let future = ChildStatus { - rid, - state: state.clone(), - }; + let future = ChildStatus { rid }; let future = future.and_then(move |run_status| { let code = run_status.code(); |