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:
Clark Gaebel 2014-10-28 09:53:45 -07:00
parent 9e94ecf99c
commit 6df1cc8e4c
14 changed files with 48 additions and 36 deletions

2
Cargo.lock generated
View file

@ -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]]

View file

@ -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"

View file

@ -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 {

View file

@ -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;

View file

@ -12,3 +12,6 @@ path = "../devtools_traits"
[dependencies.msg] [dependencies.msg]
path = "../msg" path = "../msg"
[dependencies.util]
path = "../util"

View file

@ -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())
}) })

View file

@ -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");

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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);
}); });

View file

@ -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,

View file

@ -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);
} }
} }

View file

@ -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 {