mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Run all task spawning through util, to allow for easy hooking.
During debugging, I found it useful to hook all task creation in a central location, and util::task was the perfect place for it. r? @pcwalton (or maybe someone else, I'm kinda sending you a bunch of reviews today because I don't know who better to give them to)
This commit is contained in:
parent
9e94ecf99c
commit
6df1cc8e4c
14 changed files with 48 additions and 36 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -46,6 +46,7 @@ version = "0.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"azure 0.1.0 (git+https://github.com/servo/rust-azure#e151fa23f5cb3c1ef62b4d41bad9abdd1f4f3471)",
|
"azure 0.1.0 (git+https://github.com/servo/rust-azure#e151fa23f5cb3c1ef62b4d41bad9abdd1f4f3471)",
|
||||||
"geom 0.1.0 (git+https://github.com/servo/rust-geom#b001a76e907befaae1d0d6dd259418a22092da86)",
|
"geom 0.1.0 (git+https://github.com/servo/rust-geom#b001a76e907befaae1d0d6dd259418a22092da86)",
|
||||||
|
"util 0.0.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -112,6 +113,7 @@ version = "0.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"devtools_traits 0.0.1",
|
"devtools_traits 0.0.1",
|
||||||
"msg 0.0.1",
|
"msg 0.0.1",
|
||||||
|
"util 0.0.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -12,3 +12,6 @@ git = "https://github.com/servo/rust-azure"
|
||||||
|
|
||||||
[dependencies.geom]
|
[dependencies.geom]
|
||||||
git = "https://github.com/servo/rust-geom"
|
git = "https://github.com/servo/rust-geom"
|
||||||
|
|
||||||
|
[dependencies.util]
|
||||||
|
path = "../util"
|
|
@ -6,9 +6,9 @@ use azure::azure_hl::{DrawTarget, Color, B8G8R8A8, SkiaBackend, StrokeOptions, D
|
||||||
use azure::azure_hl::{ColorPattern, ColorPatternRef};
|
use azure::azure_hl::{ColorPattern, ColorPatternRef};
|
||||||
use geom::rect::Rect;
|
use geom::rect::Rect;
|
||||||
use geom::size::Size2D;
|
use geom::size::Size2D;
|
||||||
|
use servo_util::task::spawn_named;
|
||||||
|
|
||||||
use std::comm;
|
use std::comm;
|
||||||
use std::task::TaskBuilder;
|
|
||||||
|
|
||||||
pub enum CanvasMsg {
|
pub enum CanvasMsg {
|
||||||
FillRect(Rect<f32>),
|
FillRect(Rect<f32>),
|
||||||
|
@ -37,8 +37,7 @@ impl CanvasRenderTask {
|
||||||
|
|
||||||
pub fn start(size: Size2D<i32>) -> Sender<CanvasMsg> {
|
pub fn start(size: Size2D<i32>) -> Sender<CanvasMsg> {
|
||||||
let (chan, port) = comm::channel::<CanvasMsg>();
|
let (chan, port) = comm::channel::<CanvasMsg>();
|
||||||
let builder = TaskBuilder::new().named("CanvasTask");
|
spawn_named("CanvasTask", proc() {
|
||||||
builder.spawn(proc() {
|
|
||||||
let mut renderer = CanvasRenderTask::new(size);
|
let mut renderer = CanvasRenderTask::new(size);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
|
|
@ -6,5 +6,6 @@
|
||||||
|
|
||||||
extern crate azure;
|
extern crate azure;
|
||||||
extern crate geom;
|
extern crate geom;
|
||||||
|
extern crate "util" as servo_util;
|
||||||
|
|
||||||
pub mod canvas_render_task;
|
pub mod canvas_render_task;
|
||||||
|
|
|
@ -12,3 +12,6 @@ path = "../devtools_traits"
|
||||||
|
|
||||||
[dependencies.msg]
|
[dependencies.msg]
|
||||||
path = "../msg"
|
path = "../msg"
|
||||||
|
|
||||||
|
[dependencies.util]
|
||||||
|
path = "../util"
|
|
@ -27,6 +27,7 @@ extern crate debug;
|
||||||
extern crate serialize;
|
extern crate serialize;
|
||||||
extern crate sync;
|
extern crate sync;
|
||||||
extern crate "msg" as servo_msg;
|
extern crate "msg" as servo_msg;
|
||||||
|
extern crate "util" as servo_util;
|
||||||
|
|
||||||
use actor::{Actor, ActorRegistry};
|
use actor::{Actor, ActorRegistry};
|
||||||
use actors::console::ConsoleActor;
|
use actors::console::ConsoleActor;
|
||||||
|
@ -37,6 +38,7 @@ use protocol::JsonPacketSender;
|
||||||
|
|
||||||
use devtools_traits::{ServerExitMsg, DevtoolsControlMsg, NewGlobal, DevtoolScriptControlMsg};
|
use devtools_traits::{ServerExitMsg, DevtoolsControlMsg, NewGlobal, DevtoolScriptControlMsg};
|
||||||
use servo_msg::constellation_msg::PipelineId;
|
use servo_msg::constellation_msg::PipelineId;
|
||||||
|
use servo_util::task::spawn_named;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::comm;
|
use std::comm;
|
||||||
|
@ -44,7 +46,6 @@ use std::comm::{Disconnected, Empty};
|
||||||
use std::io::{TcpListener, TcpStream};
|
use std::io::{TcpListener, TcpStream};
|
||||||
use std::io::{Acceptor, Listener, EndOfFile, TimedOut};
|
use std::io::{Acceptor, Listener, EndOfFile, TimedOut};
|
||||||
use std::num;
|
use std::num;
|
||||||
use std::task::TaskBuilder;
|
|
||||||
use serialize::json;
|
use serialize::json;
|
||||||
use sync::{Arc, Mutex};
|
use sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
@ -61,7 +62,7 @@ mod protocol;
|
||||||
/// Spin up a devtools server that listens for connections on the specified port.
|
/// Spin up a devtools server that listens for connections on the specified port.
|
||||||
pub fn start_server(port: u16) -> Sender<DevtoolsControlMsg> {
|
pub fn start_server(port: u16) -> Sender<DevtoolsControlMsg> {
|
||||||
let (sender, receiver) = comm::channel();
|
let (sender, receiver) = comm::channel();
|
||||||
TaskBuilder::new().named("devtools").spawn(proc() {
|
spawn_named("devtools", proc() {
|
||||||
run_server(receiver, port)
|
run_server(receiver, port)
|
||||||
});
|
});
|
||||||
sender
|
sender
|
||||||
|
@ -193,7 +194,7 @@ fn run_server(receiver: Receiver<DevtoolsControlMsg>, port: u16) {
|
||||||
Err(_e) => { /* connection failed */ }
|
Err(_e) => { /* connection failed */ }
|
||||||
Ok(stream) => {
|
Ok(stream) => {
|
||||||
let actors = actors.clone();
|
let actors = actors.clone();
|
||||||
spawn(proc() {
|
spawn_named("devtools-client-handler", proc() {
|
||||||
// connection succeeded
|
// connection succeeded
|
||||||
handle_client(actors, stream.clone())
|
handle_client(actors, stream.clone())
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,6 +13,7 @@ use sync::Arc;
|
||||||
use font_template::{FontTemplate, FontTemplateDescriptor};
|
use font_template::{FontTemplate, FontTemplateDescriptor};
|
||||||
use platform::font_template::FontTemplateData;
|
use platform::font_template::FontTemplateData;
|
||||||
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
||||||
|
use servo_util::task::spawn_named;
|
||||||
use style::{Source, LocalSource, UrlSource_};
|
use style::{Source, LocalSource, UrlSource_};
|
||||||
|
|
||||||
/// A list of font templates that make up a given font family.
|
/// A list of font templates that make up a given font family.
|
||||||
|
@ -245,7 +246,7 @@ impl FontCacheTask {
|
||||||
pub fn new(resource_task: ResourceTask) -> FontCacheTask {
|
pub fn new(resource_task: ResourceTask) -> FontCacheTask {
|
||||||
let (chan, port) = channel();
|
let (chan, port) = channel();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn_named("font-cache-task", proc() {
|
||||||
// TODO: Allow users to specify these.
|
// TODO: Allow users to specify these.
|
||||||
let mut generic_fonts = HashMap::with_capacity(5);
|
let mut generic_fonts = HashMap::with_capacity(5);
|
||||||
add_generic_font(&mut generic_fonts, "serif", "Times New Roman");
|
add_generic_font(&mut generic_fonts, "serif", "Times New Roman");
|
||||||
|
|
|
@ -6,11 +6,11 @@ use image::base::{Image, load_from_memory};
|
||||||
use resource_task;
|
use resource_task;
|
||||||
use resource_task::{LoadData, ResourceTask};
|
use resource_task::{LoadData, ResourceTask};
|
||||||
|
|
||||||
|
use servo_util::task::spawn_named;
|
||||||
use servo_util::taskpool::TaskPool;
|
use servo_util::taskpool::TaskPool;
|
||||||
use std::comm::{channel, Receiver, Sender};
|
use std::comm::{channel, Receiver, Sender};
|
||||||
use std::collections::hashmap::HashMap;
|
use std::collections::hashmap::HashMap;
|
||||||
use std::mem::replace;
|
use std::mem::replace;
|
||||||
use std::task::spawn;
|
|
||||||
use std::result;
|
use std::result;
|
||||||
use sync::{Arc, Mutex};
|
use sync::{Arc, Mutex};
|
||||||
use serialize::{Encoder, Encodable};
|
use serialize::{Encoder, Encodable};
|
||||||
|
@ -84,7 +84,7 @@ impl ImageCacheTask {
|
||||||
let (chan, port) = channel();
|
let (chan, port) = channel();
|
||||||
let chan_clone = chan.clone();
|
let chan_clone = chan.clone();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn_named("image-cache-task", proc() {
|
||||||
let mut cache = ImageCache {
|
let mut cache = ImageCache {
|
||||||
resource_task: resource_task,
|
resource_task: resource_task,
|
||||||
port: port,
|
port: port,
|
||||||
|
@ -105,7 +105,7 @@ impl ImageCacheTask {
|
||||||
pub fn new_sync(resource_task: ResourceTask, task_pool: TaskPool) -> ImageCacheTask {
|
pub fn new_sync(resource_task: ResourceTask, task_pool: TaskPool) -> ImageCacheTask {
|
||||||
let (chan, port) = channel();
|
let (chan, port) = channel();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn_named("image-cache-task-sync", proc() {
|
||||||
let inner_cache = ImageCacheTask::new(resource_task, task_pool);
|
let inner_cache = ImageCacheTask::new(resource_task, task_pool);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -248,7 +248,7 @@ impl ImageCache {
|
||||||
let resource_task = self.resource_task.clone();
|
let resource_task = self.resource_task.clone();
|
||||||
let url_clone = url.clone();
|
let url_clone = url.clone();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn_named("image-cache-task-prefetch", proc() {
|
||||||
let url = url_clone;
|
let url = url_clone;
|
||||||
debug!("image_cache_task: started fetch for {:s}", url.serialize());
|
debug!("image_cache_task: started fetch for {:s}", url.serialize());
|
||||||
|
|
||||||
|
@ -463,7 +463,7 @@ fn load_image_data(url: Url, resource_task: ResourceTask) -> Result<Vec<u8>, ()>
|
||||||
pub fn spawn_listener<A: Send>(f: proc(Receiver<A>):Send) -> Sender<A> {
|
pub fn spawn_listener<A: Send>(f: proc(Receiver<A>):Send) -> Sender<A> {
|
||||||
let (setup_chan, setup_port) = channel();
|
let (setup_chan, setup_port) = channel();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn_named("image-cache-task-listener", proc() {
|
||||||
let (chan, port) = channel();
|
let (chan, port) = channel();
|
||||||
setup_chan.send(chan);
|
setup_chan.send(chan);
|
||||||
f(port);
|
f(port);
|
||||||
|
|
|
@ -10,7 +10,6 @@ use file_loader;
|
||||||
use http_loader;
|
use http_loader;
|
||||||
|
|
||||||
use std::comm::{channel, Receiver, Sender};
|
use std::comm::{channel, Receiver, Sender};
|
||||||
use std::task::TaskBuilder;
|
|
||||||
use http::headers::content_type::MediaType;
|
use http::headers::content_type::MediaType;
|
||||||
use http::headers::response::HeaderCollection as ResponseHeaderCollection;
|
use http::headers::response::HeaderCollection as ResponseHeaderCollection;
|
||||||
use http::headers::request::HeaderCollection as RequestHeaderCollection;
|
use http::headers::request::HeaderCollection as RequestHeaderCollection;
|
||||||
|
@ -20,6 +19,7 @@ use url::Url;
|
||||||
use http::status::Ok as StatusOk;
|
use http::status::Ok as StatusOk;
|
||||||
use http::status::Status;
|
use http::status::Status;
|
||||||
|
|
||||||
|
use servo_util::task::spawn_named;
|
||||||
|
|
||||||
pub enum ControlMsg {
|
pub enum ControlMsg {
|
||||||
/// Request the data associated with a particular URL
|
/// Request the data associated with a particular URL
|
||||||
|
@ -166,8 +166,7 @@ pub type ResourceTask = Sender<ControlMsg>;
|
||||||
/// Create a ResourceTask
|
/// Create a ResourceTask
|
||||||
pub fn new_resource_task(user_agent: Option<String>) -> ResourceTask {
|
pub fn new_resource_task(user_agent: Option<String>) -> ResourceTask {
|
||||||
let (setup_chan, setup_port) = channel();
|
let (setup_chan, setup_port) = channel();
|
||||||
let builder = TaskBuilder::new().named("ResourceManager");
|
spawn_named("ResourceManager", proc() {
|
||||||
builder.spawn(proc() {
|
|
||||||
ResourceManager::new(setup_port, user_agent).start();
|
ResourceManager::new(setup_port, user_agent).start();
|
||||||
});
|
});
|
||||||
setup_chan
|
setup_chan
|
||||||
|
|
|
@ -24,6 +24,7 @@ use script_task::WorkerPostMessage;
|
||||||
use script_task::StackRootTLS;
|
use script_task::StackRootTLS;
|
||||||
|
|
||||||
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
||||||
|
use servo_util::task::spawn_named_native;
|
||||||
use servo_util::task_state;
|
use servo_util::task_state;
|
||||||
use servo_util::task_state::{Script, InWorker};
|
use servo_util::task_state::{Script, InWorker};
|
||||||
|
|
||||||
|
@ -34,8 +35,6 @@ use js::rust::Cx;
|
||||||
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::task::TaskBuilder;
|
|
||||||
use native::task::NativeTaskBuilder;
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -88,10 +87,7 @@ impl DedicatedWorkerGlobalScope {
|
||||||
parent_sender: ScriptChan,
|
parent_sender: ScriptChan,
|
||||||
own_sender: ScriptChan,
|
own_sender: ScriptChan,
|
||||||
receiver: Receiver<ScriptMsg>) {
|
receiver: Receiver<ScriptMsg>) {
|
||||||
TaskBuilder::new()
|
spawn_named_native(format!("Web worker for {}", worker_url.serialize()), proc() {
|
||||||
.native()
|
|
||||||
.named(format!("Web Worker at {}", worker_url.serialize()))
|
|
||||||
.spawn(proc() {
|
|
||||||
|
|
||||||
task_state::initialize(Script | InWorker);
|
task_state::initialize(Script | InWorker);
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@ use std::default::Default;
|
||||||
use std::io::{BufReader, MemWriter, Timer};
|
use std::io::{BufReader, MemWriter, Timer};
|
||||||
use std::from_str::FromStr;
|
use std::from_str::FromStr;
|
||||||
use std::path::BytesContainer;
|
use std::path::BytesContainer;
|
||||||
use std::task::TaskBuilder;
|
|
||||||
use std::time::duration::Duration;
|
use std::time::duration::Duration;
|
||||||
use std::num::Zero;
|
use std::num::Zero;
|
||||||
use time;
|
use time;
|
||||||
|
@ -549,10 +548,9 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
|
||||||
return XMLHttpRequest::fetch(&mut Sync(self), resource_task, load_data,
|
return XMLHttpRequest::fetch(&mut Sync(self), resource_task, load_data,
|
||||||
terminate_receiver, cors_request);
|
terminate_receiver, cors_request);
|
||||||
} else {
|
} else {
|
||||||
let builder = TaskBuilder::new().named("XHRTask");
|
|
||||||
self.fetch_time.set(time::now().to_timespec().sec);
|
self.fetch_time.set(time::now().to_timespec().sec);
|
||||||
let script_chan = global.root_ref().script_chan().clone();
|
let script_chan = global.root_ref().script_chan().clone();
|
||||||
builder.spawn(proc() {
|
spawn_named("XHRTask", proc() {
|
||||||
let _ = XMLHttpRequest::fetch(&mut Async(addr.unwrap(), script_chan),
|
let _ = XMLHttpRequest::fetch(&mut Async(addr.unwrap(), script_chan),
|
||||||
resource_task, load_data, terminate_receiver, cors_request);
|
resource_task, load_data, terminate_receiver, cors_request);
|
||||||
});
|
});
|
||||||
|
|
|
@ -15,6 +15,11 @@ pub fn spawn_named<S: IntoMaybeOwned<'static>>(name: S, f: proc():Send) {
|
||||||
builder.spawn(f);
|
builder.spawn(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spawn_named_native<S: IntoMaybeOwned<'static>>(name: S, f: proc():Send) {
|
||||||
|
let builder = task::TaskBuilder::new().named(name).native();
|
||||||
|
builder.spawn(f);
|
||||||
|
}
|
||||||
|
|
||||||
/// Arrange to send a particular message to a channel if the task fails.
|
/// Arrange to send a particular message to a channel if the task fails.
|
||||||
pub fn spawn_named_with_send_on_failure<T: Send>(name: &'static str,
|
pub fn spawn_named_with_send_on_failure<T: Send>(name: &'static str,
|
||||||
state: task_state::TaskState,
|
state: task_state::TaskState,
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
// The only difference is that a normal channel is used instead of a sync_channel.
|
// The only difference is that a normal channel is used instead of a sync_channel.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
use task::spawn_named;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
pub struct TaskPool {
|
pub struct TaskPool {
|
||||||
|
@ -28,9 +29,11 @@ impl TaskPool {
|
||||||
|
|
||||||
let state = Arc::new(Mutex::new(rx));
|
let state = Arc::new(Mutex::new(rx));
|
||||||
|
|
||||||
for _ in range(0, tasks) {
|
for i in range(0, tasks) {
|
||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
spawn(proc() worker(&*state));
|
spawn_named(
|
||||||
|
format!("TaskPoolWorker {}/{}", i+1, tasks),
|
||||||
|
proc() worker(&*state));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TaskPool { tx: tx };
|
return TaskPool { tx: tx };
|
||||||
|
@ -50,4 +53,3 @@ impl TaskPool {
|
||||||
self.tx.send(job);
|
self.tx.send(job);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,16 +7,15 @@
|
||||||
//! Data associated with queues is simply a pair of unsigned integers. It is expected that a
|
//! Data associated with queues is simply a pair of unsigned integers. It is expected that a
|
||||||
//! higher-level API on top of this could allow safe fork-join parallelism.
|
//! higher-level API on top of this could allow safe fork-join parallelism.
|
||||||
|
|
||||||
|
use task::spawn_named_native;
|
||||||
use task_state;
|
use task_state;
|
||||||
|
|
||||||
use native::task::NativeTaskBuilder;
|
use libc::funcs::posix88::unistd::usleep;
|
||||||
use rand::{Rng, XorShiftRng};
|
use rand::{Rng, XorShiftRng};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::rand::weak_rng;
|
use std::rand::weak_rng;
|
||||||
use std::sync::atomics::{AtomicUint, SeqCst};
|
use std::sync::atomics::{AtomicUint, SeqCst};
|
||||||
use std::sync::deque::{Abort, BufferPool, Data, Empty, Stealer, Worker};
|
use std::sync::deque::{Abort, BufferPool, Data, Empty, Stealer, Worker};
|
||||||
use std::task::TaskBuilder;
|
|
||||||
use libc::funcs::posix88::unistd::usleep;
|
|
||||||
|
|
||||||
/// A unit of work.
|
/// A unit of work.
|
||||||
///
|
///
|
||||||
|
@ -247,12 +246,15 @@ impl<QueueData: Send, WorkData: Send> WorkQueue<QueueData, WorkData> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spawn threads.
|
// Spawn threads.
|
||||||
for thread in threads.into_iter() {
|
for (i, thread) in threads.into_iter().enumerate() {
|
||||||
TaskBuilder::new().named(task_name).native().spawn(proc() {
|
|
||||||
task_state::initialize(state | task_state::InWorker);
|
spawn_named_native(
|
||||||
let mut thread = thread;
|
format!("{} worker {}/{}", task_name, i+1, thread_count),
|
||||||
thread.start()
|
proc() {
|
||||||
})
|
task_state::initialize(state | task_state::InWorker);
|
||||||
|
let mut thread = thread;
|
||||||
|
thread.start()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkQueue {
|
WorkQueue {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue