mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
auto merge of #1457 : zmike/servo/master, r=jdm
this should resolve #1169
This commit is contained in:
commit
563d6ef91a
19 changed files with 55 additions and 31 deletions
|
@ -494,7 +494,7 @@ fn should_get_glyph_advance_stress() {
|
|||
for iter::repeat(100) {
|
||||
let (chan, port) = pipes::stream();
|
||||
ports += [@port];
|
||||
do task::spawn {
|
||||
spawn_named("should_get_glyph_advance_stress") {
|
||||
let fctx = @FontContext();
|
||||
let matcher = @FontMatcher(fctx);
|
||||
let _font = matcher.get_test_font();
|
||||
|
|
|
@ -18,6 +18,7 @@ use servo_msg::constellation_msg::{ConstellationChan, PipelineId, RendererReadyM
|
|||
use servo_msg::platform::surface::NativeSurfaceAzureMethods;
|
||||
use servo_util::time::{ProfilerChan, profile};
|
||||
use servo_util::time;
|
||||
use servo_util::task::spawn_named;
|
||||
|
||||
use std::comm::{Chan, Port, SharedChan};
|
||||
use extra::arc::Arc;
|
||||
|
@ -145,7 +146,8 @@ impl<C: RenderListener + Send,T:Send+Freeze> RenderTask<C,T> {
|
|||
opts: Opts,
|
||||
profiler_chan: ProfilerChan,
|
||||
shutdown_chan: Chan<()>) {
|
||||
spawn(proc() {
|
||||
spawn_named("RenderTask", proc() {
|
||||
|
||||
{ // Ensures RenderTask and graphics context are destroyed before shutdown msg
|
||||
let native_graphics_context = compositor.get_graphics_metadata().map(
|
||||
|md| NativePaintingGraphicsContext::from_metadata(&md));
|
||||
|
|
|
@ -20,6 +20,7 @@ use servo_net::resource_task::ResourceTask;
|
|||
use servo_net::resource_task;
|
||||
use servo_util::time::ProfilerChan;
|
||||
use servo_util::url::make_url;
|
||||
use servo_util::task::spawn_named;
|
||||
use std::hashmap::{HashMap, HashSet};
|
||||
use std::util::replace;
|
||||
|
||||
|
@ -259,7 +260,7 @@ impl Constellation {
|
|||
let (constellation_port, constellation_chan) = ConstellationChan::new();
|
||||
let constellation_chan_clone = constellation_chan.clone();
|
||||
let opts_clone = opts.clone();
|
||||
spawn(proc() {
|
||||
spawn_named("Constellation", proc() {
|
||||
let mut constellation = Constellation {
|
||||
chan: constellation_chan_clone,
|
||||
request_port: constellation_port,
|
||||
|
|
|
@ -8,6 +8,7 @@ use css::node_style::StyledNode;
|
|||
use layout::incremental;
|
||||
use layout::util::LayoutDataAccess;
|
||||
use layout::wrapper::LayoutNode;
|
||||
use servo_util::task::spawn_named;
|
||||
|
||||
use extra::arc::{Arc, RWArc};
|
||||
use std::cast;
|
||||
|
@ -75,7 +76,7 @@ impl<'ln> MatchMethods for LayoutNode<'ln> {
|
|||
};
|
||||
|
||||
let evil = Some(evil);
|
||||
spawn(proc() {
|
||||
spawn_named("MatchMethods for LayoutNode", proc() {
|
||||
let mut evil = evil;
|
||||
let nodes: ~[LayoutNode] = unsafe {
|
||||
cast::transmute(evil.take_unwrap())
|
||||
|
|
|
@ -44,6 +44,7 @@ use servo_net::local_image_cache::{ImageResponder, LocalImageCache};
|
|||
use servo_util::geometry::Au;
|
||||
use servo_util::time::{ProfilerChan, profile};
|
||||
use servo_util::time;
|
||||
use servo_util::task::spawn_named;
|
||||
use std::cast::transmute;
|
||||
use std::cast;
|
||||
use std::cell::RefCell;
|
||||
|
@ -210,7 +211,7 @@ impl LayoutTask {
|
|||
opts: Opts,
|
||||
profiler_chan: ProfilerChan,
|
||||
shutdown_chan: Chan<()>) {
|
||||
spawn(proc() {
|
||||
spawn_named("LayoutTask", proc() {
|
||||
{ // Ensures layout task is destroyed before we send shutdown message
|
||||
let mut layout = LayoutTask::new(id,
|
||||
port,
|
||||
|
|
|
@ -2,9 +2,11 @@
|
|||
* 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/. */
|
||||
|
||||
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();
|
||||
spawn(proc() {
|
||||
spawn_named(name, proc() {
|
||||
let (po, ch) = Chan::new();
|
||||
setup_ch.send(ch);
|
||||
f(po);
|
||||
|
@ -12,9 +14,9 @@ pub fn spawn_listener<A: Send>(f: proc(Port<A>)) -> Chan<A> {
|
|||
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 to_child = do spawn_listener |from_parent| {
|
||||
let to_child = do spawn_listener(name) |from_parent| {
|
||||
f(from_parent, to_parent)
|
||||
};
|
||||
(from_child, to_child)
|
||||
|
|
|
@ -7,6 +7,7 @@ use servo_util::io::result;
|
|||
|
||||
use std::io;
|
||||
use std::io::File;
|
||||
use servo_util::task::spawn_named;
|
||||
|
||||
static READ_SIZE: uint = 1024;
|
||||
|
||||
|
@ -30,7 +31,7 @@ pub fn factory() -> LoaderTask {
|
|||
let f: LoaderTask = proc(url, start_chan) {
|
||||
assert!("file" == url.scheme);
|
||||
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.
|
||||
let _guard = io::ignore_io_error();
|
||||
match File::open_mode(&Path::new(url.path), io::Open, io::Read) {
|
||||
|
|
|
@ -10,10 +10,11 @@ use http::client::RequestWriter;
|
|||
use http::method::Get;
|
||||
use http::headers::HeaderEnum;
|
||||
use std::io::Reader;
|
||||
use servo_util::task::spawn_named;
|
||||
|
||||
pub fn factory() -> LoaderTask {
|
||||
let f: LoaderTask = proc(url, start_chan) {
|
||||
spawn(proc() load(url, start_chan))
|
||||
spawn_named("http_loader", proc() load(url, start_chan))
|
||||
};
|
||||
f
|
||||
}
|
||||
|
|
|
@ -492,7 +492,7 @@ mod tests {
|
|||
use servo_util::url::make_url;
|
||||
|
||||
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 {
|
||||
match port.recv() {
|
||||
resource_task::Load(_, response) => {
|
||||
|
@ -658,7 +658,7 @@ mod tests {
|
|||
|
||||
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 {
|
||||
match port.recv() {
|
||||
resource_task::Load(_, response) => {
|
||||
|
@ -701,7 +701,7 @@ mod tests {
|
|||
|
||||
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 {
|
||||
match port.recv() {
|
||||
resource_task::Load(_, response) => {
|
||||
|
|
|
@ -12,9 +12,9 @@ use image_cache_task::{Decode, GetImage, ImageCacheTask, ImageFailed, ImageNotRe
|
|||
use image_cache_task::{ImageResponseMsg, Prefetch, WaitForImage};
|
||||
|
||||
use std::comm::Port;
|
||||
use std::task;
|
||||
use servo_util::url::{UrlMap, url_map};
|
||||
use extra::url::Url;
|
||||
use servo_util::task::spawn_named;
|
||||
|
||||
pub trait ImageResponder {
|
||||
fn respond(&self) -> proc(ImageResponseMsg);
|
||||
|
@ -126,7 +126,7 @@ impl LocalImageCache {
|
|||
assert!(self.on_image_available.is_some());
|
||||
let on_image_available = self.on_image_available.as_ref().unwrap().respond();
|
||||
let url = (*url).clone();
|
||||
do task::spawn {
|
||||
do spawn_named("LocalImageCache") {
|
||||
let (response_port, response_chan) = Chan::new();
|
||||
image_cache_task.send(WaitForImage(url.clone(), response_chan));
|
||||
on_image_available(response_port.recv());
|
||||
|
|
|
@ -135,7 +135,7 @@ pub fn ResourceTask() -> 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
|
||||
ResourceManager(from_client, loaders).start()
|
||||
});
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
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();
|
||||
do task::spawn {
|
||||
do spawn_named(name) {
|
||||
let (port, chan) = SharedChan::new();
|
||||
setup_chan.send(chan);
|
||||
f(port);
|
||||
|
|
|
@ -16,6 +16,7 @@ use layout_interface::{ReflowForDisplay, DocumentDamageLevel};
|
|||
use script_task::{ExitWindowMsg, FireTimerMsg, Page, ScriptChan};
|
||||
use servo_msg::compositor_msg::ScriptListener;
|
||||
use servo_net::image_cache_task::ImageCacheTask;
|
||||
use servo_util::task::{spawn_named};
|
||||
|
||||
use js::glue::*;
|
||||
use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JSTracer, JSVal};
|
||||
|
@ -193,7 +194,7 @@ impl Window {
|
|||
let tm = Timer::new().unwrap();
|
||||
let (cancel_port, cancel_chan) = Chan::new();
|
||||
let chan = self.timer_chan.clone();
|
||||
spawn(proc() {
|
||||
spawn_named("Window:SetTimeout", proc() {
|
||||
let mut tm = tm;
|
||||
let mut timeout_port = tm.oneshot(timeout);
|
||||
let mut cancel_port = cancel_port;
|
||||
|
@ -248,7 +249,7 @@ impl Window {
|
|||
timer_chan: {
|
||||
let (timer_port, timer_chan): (Port<TimerControlMsg>, SharedChan<TimerControlMsg>) = SharedChan::new();
|
||||
let id = page.id.clone();
|
||||
spawn(proc() {
|
||||
spawn_named("timer controller", proc() {
|
||||
loop {
|
||||
match timer_port.recv() {
|
||||
TimerMessage_Close => break,
|
||||
|
|
|
@ -9,6 +9,7 @@ use encoding::EncodingRef;
|
|||
use encoding::all::UTF_8;
|
||||
use style::Stylesheet;
|
||||
use servo_net::resource_task::{Load, LoadResponse, ProgressMsg, Payload, Done, ResourceTask};
|
||||
use servo_util::task::spawn_named;
|
||||
use extra::url::Url;
|
||||
|
||||
/// 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
|
||||
let environment_encoding = UTF_8 as EncodingRef;
|
||||
|
||||
spawn(proc() {
|
||||
spawn_named("cssparser", proc() {
|
||||
// TODO: CSS parsing should take a base URL.
|
||||
let _url = match provenance {
|
||||
UrlProvenance(ref the_url) => (*the_url).clone(),
|
||||
|
|
|
@ -21,6 +21,7 @@ use servo_msg::constellation_msg::SubpageId;
|
|||
use servo_net::image_cache_task::ImageCacheTask;
|
||||
use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource};
|
||||
use servo_util::url::make_url;
|
||||
use servo_util::task::spawn_named;
|
||||
use std::cast;
|
||||
use std::cell::RefCell;
|
||||
use std::comm::{Port, SharedChan};
|
||||
|
@ -255,7 +256,7 @@ pub fn parse_html(cx: *JSContext,
|
|||
let (discovery_port, discovery_chan) = SharedChan::new();
|
||||
let stylesheet_chan = discovery_chan.clone();
|
||||
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());
|
||||
});
|
||||
|
||||
|
@ -263,7 +264,7 @@ pub fn parse_html(cx: *JSContext,
|
|||
let resource_task2 = resource_task.clone();
|
||||
let js_result_chan = discovery_chan.clone();
|
||||
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());
|
||||
});
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ use servo_net::image_cache_task::ImageCacheTask;
|
|||
use servo_net::resource_task::ResourceTask;
|
||||
use servo_util::geometry::to_frac_px;
|
||||
use servo_util::url::make_url;
|
||||
use servo_util::task::spawn_named;
|
||||
use std::comm::{Port, SharedChan};
|
||||
use std::ptr;
|
||||
use std::str::eq_slice;
|
||||
|
@ -462,7 +463,7 @@ impl ScriptTask {
|
|||
resource_task: ResourceTask,
|
||||
image_cache_task: ImageCacheTask,
|
||||
window_size: Size2D<uint>) {
|
||||
spawn(proc() {
|
||||
spawn_named("ScriptTask", proc() {
|
||||
let script_task = ScriptTask::new(id,
|
||||
@compositor as @ScriptListener,
|
||||
layout_chan,
|
||||
|
|
11
src/components/util/task.rs
Normal file
11
src/components/util/task.rs
Normal 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);
|
||||
}
|
|
@ -8,7 +8,7 @@ use extra::time::precise_time_ns;
|
|||
use extra::treemap::TreeMap;
|
||||
use std::comm::{Port, SharedChan};
|
||||
use std::iter::AdditiveIterator;
|
||||
|
||||
use task::{spawn_named};
|
||||
|
||||
// TODO: This code should be changed to use the commented code that uses timers
|
||||
// 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
|
||||
#[deriving(Clone)]
|
||||
pub struct ProfilerChan(SharedChan<ProfilerMsg>);
|
||||
|
@ -117,7 +116,7 @@ impl Profiler {
|
|||
Some(period) => {
|
||||
let period = (period * 1000f64) as u64;
|
||||
let chan = chan.clone();
|
||||
spawn(proc() {
|
||||
spawn_named("Profiler timer", proc() {
|
||||
loop {
|
||||
Timer::sleep(period);
|
||||
if !chan.try_send(PrintMsg) {
|
||||
|
@ -126,14 +125,14 @@ impl Profiler {
|
|||
}
|
||||
});
|
||||
// Spawn the profiler
|
||||
spawn(proc() {
|
||||
spawn_named("Profiler", proc() {
|
||||
let mut profiler = Profiler::new(port);
|
||||
profiler.start();
|
||||
});
|
||||
}
|
||||
None => {
|
||||
// no-op to handle profiler messages when the profiler is inactive
|
||||
spawn(proc() {
|
||||
spawn_named("Profiler", proc() {
|
||||
while port.recv_opt().is_some() {}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -18,3 +18,4 @@ pub mod url;
|
|||
pub mod vec;
|
||||
pub mod debug;
|
||||
pub mod io;
|
||||
pub mod task;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue