Merge branch 'master' into check-updates
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
#![feature(asm)]
|
||||
|
||||
extern crate test;
|
||||
extern crate bigint;
|
||||
extern crate ethcore_bigint as bigint;
|
||||
|
||||
use test::{Bencher, black_box};
|
||||
use bigint::uint::{U256, U512, Uint, U128};
|
||||
|
||||
@@ -23,12 +23,13 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
extern crate ethcore_util;
|
||||
extern crate rlp;
|
||||
extern crate ethcore_bigint as bigint;
|
||||
|
||||
use test::Bencher;
|
||||
use std::str::FromStr;
|
||||
use ethcore_util::rlp::*;
|
||||
use ethcore_util::U256;
|
||||
use rlp::*;
|
||||
use bigint::uint::U256;
|
||||
|
||||
#[bench]
|
||||
fn bench_stream_u64_value(b: &mut Bencher) {
|
||||
|
||||
@@ -56,6 +56,7 @@ pub enum IoMessage<Message> where Message: Send + Clone + Sized {
|
||||
handler_id: HandlerId,
|
||||
token: TimerToken,
|
||||
delay: u64,
|
||||
once: bool,
|
||||
},
|
||||
RemoveTimer {
|
||||
handler_id: HandlerId,
|
||||
@@ -92,12 +93,24 @@ impl<Message> IoContext<Message> where Message: Send + Clone + Sync + 'static {
|
||||
}
|
||||
}
|
||||
|
||||
/// Register a new IO timer. 'IoHandler::timeout' will be called with the token.
|
||||
/// Register a new recurring IO timer. 'IoHandler::timeout' will be called with the token.
|
||||
pub fn register_timer(&self, token: TimerToken, ms: u64) -> Result<(), IoError> {
|
||||
try!(self.channel.send_io(IoMessage::AddTimer {
|
||||
token: token,
|
||||
delay: ms,
|
||||
handler_id: self.handler,
|
||||
once: false,
|
||||
}));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Register a new IO timer once. 'IoHandler::timeout' will be called with the token.
|
||||
pub fn register_timer_once(&self, token: TimerToken, ms: u64) -> Result<(), IoError> {
|
||||
try!(self.channel.send_io(IoMessage::AddTimer {
|
||||
token: token,
|
||||
delay: ms,
|
||||
handler_id: self.handler,
|
||||
once: true,
|
||||
}));
|
||||
Ok(())
|
||||
}
|
||||
@@ -163,6 +176,7 @@ impl<Message> IoContext<Message> where Message: Send + Clone + Sync + 'static {
|
||||
struct UserTimer {
|
||||
delay: u64,
|
||||
timeout: Timeout,
|
||||
once: bool,
|
||||
}
|
||||
|
||||
/// Root IO handler. Manages user handlers, messages and IO timers.
|
||||
@@ -235,8 +249,14 @@ impl<Message> Handler for IoManager<Message> where Message: Send + Clone + Sync
|
||||
let handler_index = token.0 / TOKENS_PER_HANDLER;
|
||||
let token_id = token.0 % TOKENS_PER_HANDLER;
|
||||
if let Some(handler) = self.handlers.read().get(handler_index) {
|
||||
if let Some(timer) = self.timers.read().get(&token.0) {
|
||||
event_loop.timeout(token, Duration::from_millis(timer.delay)).expect("Error re-registering user timer");
|
||||
let maybe_timer = self.timers.read().get(&token.0).cloned();
|
||||
if let Some(timer) = maybe_timer {
|
||||
if timer.once {
|
||||
self.timers.write().remove(&token_id);
|
||||
event_loop.clear_timeout(&timer.timeout);
|
||||
} else {
|
||||
event_loop.timeout(token, Duration::from_millis(timer.delay)).expect("Error re-registering user timer");
|
||||
}
|
||||
self.worker_channel.push(Work { work_type: WorkType::Timeout, token: token_id, handler: handler.clone(), handler_id: handler_index });
|
||||
self.work_ready.notify_all();
|
||||
}
|
||||
@@ -264,10 +284,10 @@ impl<Message> Handler for IoManager<Message> where Message: Send + Clone + Sync
|
||||
event_loop.clear_timeout(&timer.timeout);
|
||||
}
|
||||
},
|
||||
IoMessage::AddTimer { handler_id, token, delay } => {
|
||||
IoMessage::AddTimer { handler_id, token, delay, once } => {
|
||||
let timer_id = token + handler_id * TOKENS_PER_HANDLER;
|
||||
let timeout = event_loop.timeout(Token(timer_id), Duration::from_millis(delay)).expect("Error registering user timer");
|
||||
self.timers.write().insert(timer_id, UserTimer { delay: delay, timeout: timeout });
|
||||
self.timers.write().insert(timer_id, UserTimer { delay: delay, timeout: timeout, once: once });
|
||||
},
|
||||
IoMessage::RemoveTimer { handler_id, token } => {
|
||||
let timer_id = token + handler_id * TOKENS_PER_HANDLER;
|
||||
|
||||
Reference in New Issue
Block a user