summaryrefslogtreecommitdiff
path: root/src/workers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/workers.rs')
-rw-r--r--src/workers.rs87
1 files changed, 52 insertions, 35 deletions
diff --git a/src/workers.rs b/src/workers.rs
index 3a3b690b2..8393de222 100644
--- a/src/workers.rs
+++ b/src/workers.rs
@@ -1,19 +1,21 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-use crate::isolate::Buf;
+use crate::cli::Buf;
+use crate::cli::Cli;
+use crate::flags::DenoFlags;
use crate::isolate::Isolate;
-use crate::isolate::IsolateState;
-use crate::isolate::WorkerChannels;
use crate::isolate_init::IsolateInit;
+use crate::isolate_state::IsolateState;
+use crate::isolate_state::WorkerChannels;
use crate::js_errors::JSErrorColor;
-use crate::ops;
use crate::permissions::DenoPermissions;
use crate::resources;
use crate::tokio_util;
use deno_core::JSError;
-
+use futures::future::lazy;
use futures::sync::mpsc;
use futures::sync::oneshot;
use futures::Future;
+use futures::Poll;
use std::sync::Arc;
use std::thread;
@@ -25,7 +27,8 @@ pub struct Worker {
impl Worker {
pub fn new(
init: IsolateInit,
- parent_state: &Arc<IsolateState>,
+ flags: DenoFlags,
+ argv: Vec<String>,
permissions: DenoPermissions,
) -> (Self, WorkerChannels) {
let (worker_in_tx, worker_in_rx) = mpsc::channel::<Buf>(1);
@@ -34,30 +37,33 @@ impl Worker {
let internal_channels = (worker_out_tx, worker_in_rx);
let external_channels = (worker_in_tx, worker_out_rx);
- let state = Arc::new(IsolateState::new(
- parent_state.flags.clone(),
- parent_state.argv.clone(),
- Some(internal_channels),
- ));
+ let state =
+ Arc::new(IsolateState::new(flags, argv, Some(internal_channels)));
- let isolate = Isolate::new(init, state, ops::dispatch, permissions);
+ let cli = Cli::new(init, state, permissions);
+ let isolate = Isolate::new(cli);
let worker = Worker { isolate };
(worker, external_channels)
}
- pub fn execute(&self, js_source: &str) -> Result<(), JSError> {
+ pub fn execute(&mut self, js_source: &str) -> Result<(), JSError> {
self.isolate.execute(js_source)
}
+}
- pub fn event_loop(&self) -> Result<(), JSError> {
- self.isolate.event_loop()
+impl Future for Worker {
+ type Item = ();
+ type Error = JSError;
+
+ fn poll(&mut self) -> Poll<(), JSError> {
+ self.isolate.poll()
}
}
pub fn spawn(
init: IsolateInit,
- state: Arc<IsolateState>,
+ state: &IsolateState,
js_source: String,
permissions: DenoPermissions,
) -> resources::Resource {
@@ -67,27 +73,38 @@ pub fn spawn(
// let (js_error_tx, js_error_rx) = oneshot::channel::<JSError>();
let (p, c) = oneshot::channel::<resources::Resource>();
let builder = thread::Builder::new().name("worker".to_string());
- let _tid = builder
- .spawn(move || {
- let (worker, external_channels) = Worker::new(init, &state, permissions);
- let resource = resources::add_worker(external_channels);
- p.send(resource.clone()).unwrap();
+ let flags = state.flags.clone();
+ let argv = state.argv.clone();
- tokio_util::init(|| {
- (|| -> Result<(), JSError> {
- worker.execute("denoMain()")?;
- worker.execute("workerMain()")?;
- worker.execute(&js_source)?;
- worker.event_loop()?;
+ let _tid = builder
+ .spawn(move || {
+ tokio_util::run(lazy(move || {
+ let (mut worker, external_channels) =
+ Worker::new(init, flags, argv, permissions);
+ let resource = resources::add_worker(external_channels);
+ p.send(resource.clone()).unwrap();
+
+ worker
+ .execute("denoMain()")
+ .expect("worker denoMain failed");
+ worker
+ .execute("workerMain()")
+ .expect("worker workerMain failed");
+ worker.execute(&js_source).expect("worker js_source failed");
+
+ worker.then(move |r| -> Result<(), ()> {
+ resource.close();
+ debug!("workers.rs after resource close");
+ if let Err(err) = r {
+ eprintln!("{}", JSErrorColor(&err).to_string());
+ std::process::exit(1);
+ }
Ok(())
- })().or_else(|err: JSError| -> Result<(), JSError> {
- eprintln!("{}", JSErrorColor(&err).to_string());
- std::process::exit(1)
- }).unwrap();
- });
+ })
+ }));
- resource.close();
+ debug!("workers.rs after spawn");
}).unwrap();
c.wait().unwrap()
@@ -103,7 +120,7 @@ mod tests {
let isolate_init = isolate_init::compiler_isolate_init();
let resource = spawn(
isolate_init,
- IsolateState::mock(),
+ &IsolateState::mock(),
r#"
onmessage = function(e) {
let s = new TextDecoder().decode(e.data);;
@@ -140,7 +157,7 @@ mod tests {
let isolate_init = isolate_init::compiler_isolate_init();
let resource = spawn(
isolate_init,
- IsolateState::mock(),
+ &IsolateState::mock(),
"onmessage = () => close();".into(),
DenoPermissions::default(),
);