mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
parent
99e2c42d16
commit
4eeda9ea27
3 changed files with 1 additions and 115 deletions
|
@ -13,7 +13,6 @@ use msg;
|
||||||
use flatbuffers::FlatBufferBuilder;
|
use flatbuffers::FlatBufferBuilder;
|
||||||
use futures;
|
use futures;
|
||||||
use futures::future::poll_fn;
|
use futures::future::poll_fn;
|
||||||
use futures::sync::oneshot;
|
|
||||||
use futures::Poll;
|
use futures::Poll;
|
||||||
use hyper;
|
use hyper;
|
||||||
use hyper::rt::{Future, Stream};
|
use hyper::rt::{Future, Stream};
|
||||||
|
@ -30,7 +29,6 @@ use std::sync::Arc;
|
||||||
use std::time::UNIX_EPOCH;
|
use std::time::UNIX_EPOCH;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use tokio;
|
use tokio;
|
||||||
use tokio::timer::Delay;
|
|
||||||
use tokio_io;
|
use tokio_io;
|
||||||
use tokio_threadpool;
|
use tokio_threadpool;
|
||||||
|
|
||||||
|
@ -71,8 +69,6 @@ pub fn msg_from_js(
|
||||||
msg::Any::CodeCache => handle_code_cache,
|
msg::Any::CodeCache => handle_code_cache,
|
||||||
msg::Any::Environ => handle_env,
|
msg::Any::Environ => handle_env,
|
||||||
msg::Any::FetchReq => handle_fetch_req,
|
msg::Any::FetchReq => handle_fetch_req,
|
||||||
msg::Any::TimerStart => handle_timer_start,
|
|
||||||
msg::Any::TimerClear => handle_timer_clear,
|
|
||||||
msg::Any::MakeTempDir => handle_make_temp_dir,
|
msg::Any::MakeTempDir => handle_make_temp_dir,
|
||||||
msg::Any::Mkdir => handle_mkdir,
|
msg::Any::Mkdir => handle_mkdir,
|
||||||
msg::Any::Open => handle_open,
|
msg::Any::Open => handle_open,
|
||||||
|
@ -446,30 +442,6 @@ fn handle_fetch_req(
|
||||||
Box::new(future)
|
Box::new(future)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_timeout<F>(
|
|
||||||
cb: F,
|
|
||||||
delay: u32,
|
|
||||||
) -> (
|
|
||||||
impl Future<Item = (), Error = ()>,
|
|
||||||
futures::sync::oneshot::Sender<()>,
|
|
||||||
)
|
|
||||||
where
|
|
||||||
F: FnOnce() -> (),
|
|
||||||
{
|
|
||||||
let (cancel_tx, cancel_rx) = oneshot::channel::<()>();
|
|
||||||
let when = Instant::now() + Duration::from_millis(delay.into());
|
|
||||||
let delay_task = Delay::new(when)
|
|
||||||
.map_err(|e| panic!("timer failed; err={:?}", e))
|
|
||||||
.and_then(|_| {
|
|
||||||
cb();
|
|
||||||
Ok(())
|
|
||||||
}).select(cancel_rx)
|
|
||||||
.map(|_| ())
|
|
||||||
.map_err(|_| ());
|
|
||||||
|
|
||||||
(delay_task, cancel_tx)
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is just type conversion. Implement From trait?
|
// This is just type conversion. Implement From trait?
|
||||||
// See https://github.com/tokio-rs/tokio/blob/ffd73a64e7ec497622b7f939e38017afe7124dc4/tokio-fs/src/lib.rs#L76-L85
|
// See https://github.com/tokio-rs/tokio/blob/ffd73a64e7ec497622b7f939e38017afe7124dc4/tokio-fs/src/lib.rs#L76-L85
|
||||||
fn convert_blocking<F>(f: F) -> Poll<Buf, DenoError>
|
fn convert_blocking<F>(f: F) -> Poll<Buf, DenoError>
|
||||||
|
@ -865,72 +837,6 @@ fn handle_write_file(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_timer(state: Arc<IsolateState>, timer_id: u32) {
|
|
||||||
let mut timers = state.timers.lock().unwrap();
|
|
||||||
timers.remove(&timer_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prototype: https://github.com/ry/isolate/blob/golang/timers.go#L25-L39
|
|
||||||
fn handle_timer_start(
|
|
||||||
state: Arc<IsolateState>,
|
|
||||||
base: &msg::Base,
|
|
||||||
data: &'static mut [u8],
|
|
||||||
) -> Box<Op> {
|
|
||||||
assert_eq!(data.len(), 0);
|
|
||||||
debug!("handle_timer_start");
|
|
||||||
let msg = base.msg_as_timer_start().unwrap();
|
|
||||||
let cmd_id = base.cmd_id();
|
|
||||||
let timer_id = msg.id();
|
|
||||||
let delay = msg.delay();
|
|
||||||
|
|
||||||
let config2 = state.clone();
|
|
||||||
let future = {
|
|
||||||
let (delay_task, cancel_delay) = set_timeout(
|
|
||||||
move || {
|
|
||||||
remove_timer(config2, timer_id);
|
|
||||||
},
|
|
||||||
delay,
|
|
||||||
);
|
|
||||||
let mut timers = state.timers.lock().unwrap();
|
|
||||||
timers.insert(timer_id, cancel_delay);
|
|
||||||
delay_task
|
|
||||||
};
|
|
||||||
let r = Box::new(future.then(move |result| {
|
|
||||||
let builder = &mut FlatBufferBuilder::new();
|
|
||||||
let msg = msg::TimerReady::create(
|
|
||||||
builder,
|
|
||||||
&msg::TimerReadyArgs {
|
|
||||||
id: timer_id,
|
|
||||||
canceled: result.is_err(),
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
);
|
|
||||||
Ok(serialize_response(
|
|
||||||
cmd_id,
|
|
||||||
builder,
|
|
||||||
msg::BaseArgs {
|
|
||||||
msg: Some(msg.as_union_value()),
|
|
||||||
msg_type: msg::Any::TimerReady,
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
))
|
|
||||||
}));
|
|
||||||
r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prototype: https://github.com/ry/isolate/blob/golang/timers.go#L40-L43
|
|
||||||
fn handle_timer_clear(
|
|
||||||
state: Arc<IsolateState>,
|
|
||||||
base: &msg::Base,
|
|
||||||
data: &'static mut [u8],
|
|
||||||
) -> Box<Op> {
|
|
||||||
assert_eq!(data.len(), 0);
|
|
||||||
let msg = base.msg_as_timer_clear().unwrap();
|
|
||||||
debug!("handle_timer_clear");
|
|
||||||
remove_timer(state, msg.id());
|
|
||||||
ok_future(empty_buf())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn handle_rename(
|
fn handle_rename(
|
||||||
state: Arc<IsolateState>,
|
state: Arc<IsolateState>,
|
||||||
base: &msg::Base,
|
base: &msg::Base,
|
||||||
|
|
|
@ -9,11 +9,9 @@ use errors::DenoError;
|
||||||
use flags;
|
use flags;
|
||||||
use libdeno;
|
use libdeno;
|
||||||
|
|
||||||
use futures;
|
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use libc::c_void;
|
use libc::c_void;
|
||||||
use std;
|
use std;
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
@ -54,7 +52,6 @@ pub struct Isolate {
|
||||||
// needs to be accessed outside the main V8 thread should be inside IsolateState.
|
// needs to be accessed outside the main V8 thread should be inside IsolateState.
|
||||||
pub struct IsolateState {
|
pub struct IsolateState {
|
||||||
pub dir: deno_dir::DenoDir,
|
pub dir: deno_dir::DenoDir,
|
||||||
pub timers: Mutex<HashMap<u32, futures::sync::oneshot::Sender<()>>>,
|
|
||||||
pub argv: Vec<String>,
|
pub argv: Vec<String>,
|
||||||
pub flags: flags::DenoFlags,
|
pub flags: flags::DenoFlags,
|
||||||
tx: Mutex<Option<mpsc::Sender<(i32, Buf)>>>,
|
tx: Mutex<Option<mpsc::Sender<(i32, Buf)>>>,
|
||||||
|
@ -92,7 +89,6 @@ impl Isolate {
|
||||||
timeout_due: None,
|
timeout_due: None,
|
||||||
state: Arc::new(IsolateState {
|
state: Arc::new(IsolateState {
|
||||||
dir: deno_dir::DenoDir::new(flags.reload, None).unwrap(),
|
dir: deno_dir::DenoDir::new(flags.reload, None).unwrap(),
|
||||||
timers: Mutex::new(HashMap::new()),
|
|
||||||
argv: argv_rest,
|
argv: argv_rest,
|
||||||
flags,
|
flags,
|
||||||
tx: Mutex::new(Some(tx)),
|
tx: Mutex::new(Some(tx)),
|
||||||
|
@ -280,6 +276,7 @@ extern "C" fn pre_dispatch(
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use futures;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_c_to_rust() {
|
fn test_c_to_rust() {
|
||||||
|
|
17
src/msg.fbs
17
src/msg.fbs
|
@ -6,9 +6,6 @@ union Any {
|
||||||
CodeCache,
|
CodeCache,
|
||||||
SetTimeout,
|
SetTimeout,
|
||||||
Exit,
|
Exit,
|
||||||
TimerStart,
|
|
||||||
TimerReady,
|
|
||||||
TimerClear,
|
|
||||||
Environ,
|
Environ,
|
||||||
EnvironRes,
|
EnvironRes,
|
||||||
FetchReq,
|
FetchReq,
|
||||||
|
@ -135,20 +132,6 @@ table Exit {
|
||||||
code: int;
|
code: int;
|
||||||
}
|
}
|
||||||
|
|
||||||
table TimerStart {
|
|
||||||
id: uint;
|
|
||||||
delay: uint;
|
|
||||||
}
|
|
||||||
|
|
||||||
table TimerReady {
|
|
||||||
id: uint;
|
|
||||||
canceled: bool;
|
|
||||||
}
|
|
||||||
|
|
||||||
table TimerClear {
|
|
||||||
id: uint;
|
|
||||||
}
|
|
||||||
|
|
||||||
table Environ {}
|
table Environ {}
|
||||||
|
|
||||||
table SetEnv {
|
table SetEnv {
|
||||||
|
|
Loading…
Add table
Reference in a new issue