add names for all servo spawned tasks

* add servo_util::task::{spawn_named,spawn_with_named} functions

* add name param for spawn_listener and spawn_conversation functions

this should resolve #1169
This commit is contained in:
zmike 2014-01-03 15:43:11 -05:00 committed by Mike Blumenkrantz
parent 99f24fbd40
commit 193b6d2635
19 changed files with 55 additions and 31 deletions

View file

@ -494,7 +494,7 @@ fn should_get_glyph_advance_stress() {
for iter::repeat(100) { for iter::repeat(100) {
let (chan, port) = pipes::stream(); let (chan, port) = pipes::stream();
ports += [@port]; ports += [@port];
do task::spawn { spawn_named("should_get_glyph_advance_stress") {
let fctx = @FontContext(); let fctx = @FontContext();
let matcher = @FontMatcher(fctx); let matcher = @FontMatcher(fctx);
let _font = matcher.get_test_font(); let _font = matcher.get_test_font();

View file

@ -18,6 +18,7 @@ use servo_msg::constellation_msg::{ConstellationChan, PipelineId, RendererReadyM
use servo_msg::platform::surface::NativeSurfaceAzureMethods; use servo_msg::platform::surface::NativeSurfaceAzureMethods;
use servo_util::time::{ProfilerChan, profile}; use servo_util::time::{ProfilerChan, profile};
use servo_util::time; use servo_util::time;
use servo_util::task::spawn_named;
use std::comm::{Chan, Port, SharedChan}; use std::comm::{Chan, Port, SharedChan};
use extra::arc::Arc; use extra::arc::Arc;
@ -145,7 +146,8 @@ impl<C: RenderListener + Send,T:Send+Freeze> RenderTask<C,T> {
opts: Opts, opts: Opts,
profiler_chan: ProfilerChan, profiler_chan: ProfilerChan,
shutdown_chan: Chan<()>) { shutdown_chan: Chan<()>) {
spawn(proc() { spawn_named("RenderTask", proc() {
{ // Ensures RenderTask and graphics context are destroyed before shutdown msg { // Ensures RenderTask and graphics context are destroyed before shutdown msg
let native_graphics_context = compositor.get_graphics_metadata().map( let native_graphics_context = compositor.get_graphics_metadata().map(
|md| NativePaintingGraphicsContext::from_metadata(&md)); |md| NativePaintingGraphicsContext::from_metadata(&md));

View file

@ -20,6 +20,7 @@ use servo_net::resource_task::ResourceTask;
use servo_net::resource_task; use servo_net::resource_task;
use servo_util::time::ProfilerChan; use servo_util::time::ProfilerChan;
use servo_util::url::make_url; use servo_util::url::make_url;
use servo_util::task::spawn_named;
use std::hashmap::{HashMap, HashSet}; use std::hashmap::{HashMap, HashSet};
use std::util::replace; use std::util::replace;
@ -259,7 +260,7 @@ impl Constellation {
let (constellation_port, constellation_chan) = ConstellationChan::new(); let (constellation_port, constellation_chan) = ConstellationChan::new();
let constellation_chan_clone = constellation_chan.clone(); let constellation_chan_clone = constellation_chan.clone();
let opts_clone = opts.clone(); let opts_clone = opts.clone();
spawn(proc() { spawn_named("Constellation", proc() {
let mut constellation = Constellation { let mut constellation = Constellation {
chan: constellation_chan_clone, chan: constellation_chan_clone,
request_port: constellation_port, request_port: constellation_port,

View file

@ -8,6 +8,7 @@ use css::node_style::StyledNode;
use layout::incremental; use layout::incremental;
use layout::util::LayoutDataAccess; use layout::util::LayoutDataAccess;
use layout::wrapper::LayoutNode; use layout::wrapper::LayoutNode;
use servo_util::task::spawn_named;
use extra::arc::{Arc, RWArc}; use extra::arc::{Arc, RWArc};
use std::cast; use std::cast;
@ -75,7 +76,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> {
}; };
let evil = Some(evil); let evil = Some(evil);
spawn(proc() { spawn_named("MatchMethods for LayoutNode", proc() {
let mut evil = evil; let mut evil = evil;
let nodes: ~[LayoutNode] = unsafe { let nodes: ~[LayoutNode] = unsafe {
cast::transmute(evil.take_unwrap()) cast::transmute(evil.take_unwrap())

View file

@ -44,6 +44,7 @@ use servo_net::local_image_cache::{ImageResponder, LocalImageCache};
use servo_util::geometry::Au; use servo_util::geometry::Au;
use servo_util::time::{ProfilerChan, profile}; use servo_util::time::{ProfilerChan, profile};
use servo_util::time; use servo_util::time;
use servo_util::task::spawn_named;
use std::cast::transmute; use std::cast::transmute;
use std::cast; use std::cast;
use std::cell::RefCell; use std::cell::RefCell;
@ -210,7 +211,7 @@ impl LayoutTask {
opts: Opts, opts: Opts,
profiler_chan: ProfilerChan, profiler_chan: ProfilerChan,
shutdown_chan: Chan<()>) { shutdown_chan: Chan<()>) {
spawn(proc() { spawn_named("LayoutTask", proc() {
{ // Ensures layout task is destroyed before we send shutdown message { // Ensures layout task is destroyed before we send shutdown message
let mut layout = LayoutTask::new(id, let mut layout = LayoutTask::new(id,
port, port,

View file

@ -2,9 +2,11 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
pub fn spawn_listener<A: Send>(f: proc(Port<A>)) -> Chan<A> { use servo_util::task::spawn_named;
pub fn spawn_listener<A: Send, S: IntoSendStr>(name: S, f: proc(Port<A>)) -> Chan<A> {
let (setup_po, setup_ch) = Chan::new(); let (setup_po, setup_ch) = Chan::new();
spawn(proc() { spawn_named(name, proc() {
let (po, ch) = Chan::new(); let (po, ch) = Chan::new();
setup_ch.send(ch); setup_ch.send(ch);
f(po); f(po);
@ -12,9 +14,9 @@ pub fn spawn_listener<A: Send>(f: proc(Port<A>)) -> Chan<A> {
setup_po.recv() setup_po.recv()
} }
pub fn spawn_conversation<A: Send, B: Send>(f: proc(Port<A>, Chan<B>)) -> (Port<B>, Chan<A>) { pub fn spawn_conversation<A: Send, B: Send, S: IntoSendStr>(name: S, f: proc(Port<A>, Chan<B>)) -> (Port<B>, Chan<A>) {
let (from_child, to_parent) = Chan::new(); let (from_child, to_parent) = Chan::new();
let to_child = do spawn_listener |from_parent| { let to_child = do spawn_listener(name) |from_parent| {
f(from_parent, to_parent) f(from_parent, to_parent)
}; };
(from_child, to_child) (from_child, to_child)

View file

@ -7,6 +7,7 @@ use servo_util::io::result;
use std::io; use std::io;
use std::io::File; use std::io::File;
use servo_util::task::spawn_named;
static READ_SIZE: uint = 1024; static READ_SIZE: uint = 1024;
@ -30,7 +31,7 @@ pub fn factory() -> LoaderTask {
let f: LoaderTask = proc(url, start_chan) { let f: LoaderTask = proc(url, start_chan) {
assert!("file" == url.scheme); assert!("file" == url.scheme);
let progress_chan = start_sending(start_chan, Metadata::default(url.clone())); let progress_chan = start_sending(start_chan, Metadata::default(url.clone()));
spawn(proc() { spawn_named("file_loader", proc() {
// ignore_io_error causes us to get None instead of a task failure. // ignore_io_error causes us to get None instead of a task failure.
let _guard = io::ignore_io_error(); let _guard = io::ignore_io_error();
match File::open_mode(&Path::new(url.path), io::Open, io::Read) { match File::open_mode(&Path::new(url.path), io::Open, io::Read) {

View file

@ -10,10 +10,11 @@ use http::client::RequestWriter;
use http::method::Get; use http::method::Get;
use http::headers::HeaderEnum; use http::headers::HeaderEnum;
use std::io::Reader; use std::io::Reader;
use servo_util::task::spawn_named;
pub fn factory() -> LoaderTask { pub fn factory() -> LoaderTask {
let f: LoaderTask = proc(url, start_chan) { let f: LoaderTask = proc(url, start_chan) {
spawn(proc() load(url, start_chan)) spawn_named("http_loader", proc() load(url, start_chan))
}; };
f f
} }

View file

@ -492,7 +492,7 @@ mod tests {
use servo_util::url::make_url; use servo_util::url::make_url;
fn mock_resource_task(on_load: proc(resource: SharedChan<resource_task::ProgressMsg>)) -> ResourceTask { fn mock_resource_task(on_load: proc(resource: SharedChan<resource_task::ProgressMsg>)) -> ResourceTask {
spawn_listener(proc(port: Port<resource_task::ControlMsg>) { spawn_listener("mock_resource_task", proc(port: Port<resource_task::ControlMsg>) {
loop { loop {
match port.recv() { match port.recv() {
resource_task::Load(_, response) => { resource_task::Load(_, response) => {
@ -658,7 +658,7 @@ mod tests {
let (resource_task_exited, resource_task_exited_chan) = Chan::new(); let (resource_task_exited, resource_task_exited_chan) = Chan::new();
let mock_resource_task = spawn_listener(proc(port: Port<resource_task::ControlMsg>) { let mock_resource_task = spawn_listener("should_not...already_available", proc(port: Port<resource_task::ControlMsg>) {
loop { loop {
match port.recv() { match port.recv() {
resource_task::Load(_, response) => { resource_task::Load(_, response) => {
@ -701,7 +701,7 @@ mod tests {
let (resource_task_exited, resource_task_exited_chan) = Chan::new(); let (resource_task_exited, resource_task_exited_chan) = Chan::new();
let mock_resource_task = spawn_listener(proc(port: Port<resource_task::ControlMsg>) { let mock_resource_task = spawn_listener("should_not...already_failed", proc(port: Port<resource_task::ControlMsg>) {
loop { loop {
match port.recv() { match port.recv() {
resource_task::Load(_, response) => { resource_task::Load(_, response) => {

View file

@ -12,9 +12,9 @@ use image_cache_task::{Decode, GetImage, ImageCacheTask, ImageFailed, ImageNotRe
use image_cache_task::{ImageResponseMsg, Prefetch, WaitForImage}; use image_cache_task::{ImageResponseMsg, Prefetch, WaitForImage};
use std::comm::Port; use std::comm::Port;
use std::task;
use servo_util::url::{UrlMap, url_map}; use servo_util::url::{UrlMap, url_map};
use extra::url::Url; use extra::url::Url;
use servo_util::task::spawn_named;
pub trait ImageResponder { pub trait ImageResponder {
fn respond(&self) -> proc(ImageResponseMsg); fn respond(&self) -> proc(ImageResponseMsg);
@ -126,7 +126,7 @@ impl LocalImageCache {
assert!(self.on_image_available.is_some()); assert!(self.on_image_available.is_some());
let on_image_available = self.on_image_available.as_ref().unwrap().respond(); let on_image_available = self.on_image_available.as_ref().unwrap().respond();
let url = (*url).clone(); let url = (*url).clone();
do task::spawn { do spawn_named("LocalImageCache") {
let (response_port, response_chan) = Chan::new(); let (response_port, response_chan) = Chan::new();
image_cache_task.send(WaitForImage(url.clone(), response_chan)); image_cache_task.send(WaitForImage(url.clone(), response_chan));
on_image_available(response_port.recv()); on_image_available(response_port.recv());

View file

@ -135,7 +135,7 @@ pub fn ResourceTask() -> ResourceTask {
} }
fn create_resource_task_with_loaders(loaders: ~[(~str, LoaderTaskFactory)]) -> ResourceTask { fn create_resource_task_with_loaders(loaders: ~[(~str, LoaderTaskFactory)]) -> ResourceTask {
let chan = spawn_listener(proc(from_client) { let chan = spawn_listener("ResourceManager", proc(from_client) {
// TODO: change copy to move once we can move out of closures // TODO: change copy to move once we can move out of closures
ResourceManager(from_client, loaders).start() ResourceManager(from_client, loaders).start()
}); });

View file

@ -3,11 +3,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::comm::{Chan, Port}; use std::comm::{Chan, Port};
use std::task; use servo_util::task::spawn_named;
pub fn spawn_listener<A: Send>(f: proc(Port<A>)) -> SharedChan<A> { pub fn spawn_listener<A: Send, S: IntoSendStr>(name: S, f: proc(Port<A>)) -> SharedChan<A> {
let (setup_port, setup_chan) = Chan::new(); let (setup_port, setup_chan) = Chan::new();
do task::spawn { do spawn_named(name) {
let (port, chan) = SharedChan::new(); let (port, chan) = SharedChan::new();
setup_chan.send(chan); setup_chan.send(chan);
f(port); f(port);

View file

@ -16,6 +16,7 @@ use layout_interface::{ReflowForDisplay, DocumentDamageLevel};
use script_task::{ExitWindowMsg, FireTimerMsg, Page, ScriptChan}; use script_task::{ExitWindowMsg, FireTimerMsg, Page, ScriptChan};
use servo_msg::compositor_msg::ScriptListener; use servo_msg::compositor_msg::ScriptListener;
use servo_net::image_cache_task::ImageCacheTask; use servo_net::image_cache_task::ImageCacheTask;
use servo_util::task::{spawn_named};
use js::glue::*; use js::glue::*;
use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JSTracer, JSVal}; use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JSTracer, JSVal};
@ -193,7 +194,7 @@ impl Window {
let tm = Timer::new().unwrap(); let tm = Timer::new().unwrap();
let (cancel_port, cancel_chan) = Chan::new(); let (cancel_port, cancel_chan) = Chan::new();
let chan = self.timer_chan.clone(); let chan = self.timer_chan.clone();
spawn(proc() { spawn_named("Window:SetTimeout", proc() {
let mut tm = tm; let mut tm = tm;
let mut timeout_port = tm.oneshot(timeout); let mut timeout_port = tm.oneshot(timeout);
let mut cancel_port = cancel_port; let mut cancel_port = cancel_port;
@ -248,7 +249,7 @@ impl Window {
timer_chan: { timer_chan: {
let (timer_port, timer_chan): (Port<TimerControlMsg>, SharedChan<TimerControlMsg>) = SharedChan::new(); let (timer_port, timer_chan): (Port<TimerControlMsg>, SharedChan<TimerControlMsg>) = SharedChan::new();
let id = page.id.clone(); let id = page.id.clone();
spawn(proc() { spawn_named("timer controller", proc() {
loop { loop {
match timer_port.recv() { match timer_port.recv() {
TimerMessage_Close => break, TimerMessage_Close => break,

View file

@ -9,6 +9,7 @@ use encoding::EncodingRef;
use encoding::all::UTF_8; use encoding::all::UTF_8;
use style::Stylesheet; use style::Stylesheet;
use servo_net::resource_task::{Load, LoadResponse, ProgressMsg, Payload, Done, ResourceTask}; use servo_net::resource_task::{Load, LoadResponse, ProgressMsg, Payload, Done, ResourceTask};
use servo_util::task::spawn_named;
use extra::url::Url; use extra::url::Url;
/// Where a style sheet comes from. /// Where a style sheet comes from.
@ -25,7 +26,7 @@ pub fn spawn_css_parser(provenance: StylesheetProvenance,
// TODO: Get the actual value. http://dev.w3.org/csswg/css-syntax/#environment-encoding // TODO: Get the actual value. http://dev.w3.org/csswg/css-syntax/#environment-encoding
let environment_encoding = UTF_8 as EncodingRef; let environment_encoding = UTF_8 as EncodingRef;
spawn(proc() { spawn_named("cssparser", proc() {
// TODO: CSS parsing should take a base URL. // TODO: CSS parsing should take a base URL.
let _url = match provenance { let _url = match provenance {
UrlProvenance(ref the_url) => (*the_url).clone(), UrlProvenance(ref the_url) => (*the_url).clone(),

View file

@ -21,6 +21,7 @@ use servo_msg::constellation_msg::SubpageId;
use servo_net::image_cache_task::ImageCacheTask; use servo_net::image_cache_task::ImageCacheTask;
use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource}; use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource};
use servo_util::url::make_url; use servo_util::url::make_url;
use servo_util::task::spawn_named;
use std::cast; use std::cast;
use std::cell::RefCell; use std::cell::RefCell;
use std::comm::{Port, SharedChan}; use std::comm::{Port, SharedChan};
@ -255,7 +256,7 @@ pub fn parse_html(cx: *JSContext,
let (discovery_port, discovery_chan) = SharedChan::new(); let (discovery_port, discovery_chan) = SharedChan::new();
let stylesheet_chan = discovery_chan.clone(); let stylesheet_chan = discovery_chan.clone();
let (css_msg_port, css_chan) = SharedChan::new(); let (css_msg_port, css_chan) = SharedChan::new();
spawn(proc() { spawn_named("parse_html:css", proc() {
css_link_listener(stylesheet_chan, css_msg_port, resource_task2.clone()); css_link_listener(stylesheet_chan, css_msg_port, resource_task2.clone());
}); });
@ -263,7 +264,7 @@ pub fn parse_html(cx: *JSContext,
let resource_task2 = resource_task.clone(); let resource_task2 = resource_task.clone();
let js_result_chan = discovery_chan.clone(); let js_result_chan = discovery_chan.clone();
let (js_msg_port, js_chan) = SharedChan::new(); let (js_msg_port, js_chan) = SharedChan::new();
spawn(proc() { spawn_named("parse_html:js", proc() {
js_script_listener(js_result_chan, js_msg_port, resource_task2.clone()); js_script_listener(js_result_chan, js_msg_port, resource_task2.clone());
}); });

View file

@ -46,6 +46,7 @@ use servo_net::image_cache_task::ImageCacheTask;
use servo_net::resource_task::ResourceTask; use servo_net::resource_task::ResourceTask;
use servo_util::geometry::to_frac_px; use servo_util::geometry::to_frac_px;
use servo_util::url::make_url; use servo_util::url::make_url;
use servo_util::task::spawn_named;
use std::comm::{Port, SharedChan}; use std::comm::{Port, SharedChan};
use std::ptr; use std::ptr;
use std::str::eq_slice; use std::str::eq_slice;
@ -462,7 +463,7 @@ impl ScriptTask {
resource_task: ResourceTask, resource_task: ResourceTask,
image_cache_task: ImageCacheTask, image_cache_task: ImageCacheTask,
window_size: Size2D<uint>) { window_size: Size2D<uint>) {
spawn(proc() { spawn_named("ScriptTask", proc() {
let script_task = ScriptTask::new(id, let script_task = ScriptTask::new(id,
@compositor as @ScriptListener, @compositor as @ScriptListener,
layout_chan, layout_chan,

View file

@ -0,0 +1,11 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::task;
pub fn spawn_named<S: IntoSendStr>(name: S, f: proc()) {
let mut builder = task::task();
builder.name(name);
builder.spawn(f);
}

View file

@ -8,7 +8,7 @@ use extra::time::precise_time_ns;
use extra::treemap::TreeMap; use extra::treemap::TreeMap;
use std::comm::{Port, SharedChan}; use std::comm::{Port, SharedChan};
use std::iter::AdditiveIterator; use std::iter::AdditiveIterator;
use task::{spawn_named};
// TODO: This code should be changed to use the commented code that uses timers // TODO: This code should be changed to use the commented code that uses timers
// directly, once native timers land in Rust. // directly, once native timers land in Rust.
@ -26,7 +26,6 @@ impl Timer {
} }
} }
// front-end representation of the profiler used to communicate with the profiler // front-end representation of the profiler used to communicate with the profiler
#[deriving(Clone)] #[deriving(Clone)]
pub struct ProfilerChan(SharedChan<ProfilerMsg>); pub struct ProfilerChan(SharedChan<ProfilerMsg>);
@ -117,7 +116,7 @@ impl Profiler {
Some(period) => { Some(period) => {
let period = (period * 1000f64) as u64; let period = (period * 1000f64) as u64;
let chan = chan.clone(); let chan = chan.clone();
spawn(proc() { spawn_named("Profiler timer", proc() {
loop { loop {
Timer::sleep(period); Timer::sleep(period);
if !chan.try_send(PrintMsg) { if !chan.try_send(PrintMsg) {
@ -126,14 +125,14 @@ impl Profiler {
} }
}); });
// Spawn the profiler // Spawn the profiler
spawn(proc() { spawn_named("Profiler", proc() {
let mut profiler = Profiler::new(port); let mut profiler = Profiler::new(port);
profiler.start(); profiler.start();
}); });
} }
None => { None => {
// no-op to handle profiler messages when the profiler is inactive // no-op to handle profiler messages when the profiler is inactive
spawn(proc() { spawn_named("Profiler", proc() {
while port.recv_opt().is_some() {} while port.recv_opt().is_some() {}
}); });
} }

View file

@ -18,3 +18,4 @@ pub mod url;
pub mod vec; pub mod vec;
pub mod debug; pub mod debug;
pub mod io; pub mod io;
pub mod task;