diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-07-09 16:50:06 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-07-31 11:27:49 -0700 |
commit | 44d13f7fd419bdff1420ed21ca3efd72f4015bfa (patch) | |
tree | eef95c16a10775746262be4eb8fae0859b7ae15d /components/script/dom | |
parent | 9c9d7dc93b1d64b1524eb2bdcbdc817319abc8b9 (diff) | |
download | servo-44d13f7fd419bdff1420ed21ca3efd72f4015bfa.tar.gz servo-44d13f7fd419bdff1420ed21ca3efd72f4015bfa.zip |
net: Use a thread for each `AsyncResponseTarget` to avoid having to send
trait objects across process boundaries.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/document.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 12 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 14 |
3 files changed, 22 insertions, 8 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2e5a479f4e6..31800bcc014 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -283,7 +283,7 @@ pub trait DocumentHelpers<'a> { /// https://w3c.github.io/animation-timing/#dfn-invoke-callbacks-algorithm fn invoke_animation_callbacks(self); fn prepare_async_load(self, load: LoadType) -> PendingAsyncLoad; - fn load_async(self, load: LoadType, listener: Box<AsyncResponseTarget + Send>); + fn load_async(self, load: LoadType, listener: AsyncResponseTarget); fn load_sync(self, load: LoadType) -> Result<(Metadata, Vec<u8>), String>; fn finish_load(self, load: LoadType); fn set_current_parser(self, script: Option<&ServoHTMLParser>); @@ -968,7 +968,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { loader.prepare_async_load(load) } - fn load_async(self, load: LoadType, listener: Box<AsyncResponseTarget + Send>) { + fn load_async(self, load: LoadType, listener: AsyncResponseTarget) { let mut loader = self.loader.borrow_mut(); loader.load_async(load, listener) } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 56ea651ef7d..8e28fa51b62 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -40,12 +40,14 @@ use js::jsval::UndefinedValue; use encoding::all::UTF_8; use encoding::label::encoding_from_whatwg_label; use encoding::types::{Encoding, EncodingRef, DecoderTrap}; -use net_traits::{Metadata, AsyncResponseListener}; +use net_traits::{Metadata, AsyncResponseListener, AsyncResponseTarget}; use util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec}; use html5ever::tree_builder::NextParserState; use std::cell::{RefCell, Cell}; use std::mem; +use std::sync::mpsc; use std::sync::{Arc, Mutex}; +use std::thread; use string_cache::Atom; use url::{Url, UrlParser}; @@ -330,12 +332,18 @@ impl<'a> HTMLScriptElementHelpers for &'a HTMLScriptElement { url: url.clone(), })); + let (action_sender, action_receiver) = mpsc::channel(); let listener = box NetworkListener { context: context, script_chan: script_chan, + receiver: action_receiver, }; + let response_target = AsyncResponseTarget { + sender: action_sender, + }; + thread::spawn(move || listener.run()); - doc.r().load_async(LoadType::Script(url), listener); + doc.r().load_async(LoadType::Script(url), response_target); if self.parser_inserted.get() { doc.r().get_current_parser().unwrap().r().suspend(); diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 7cb33d1b023..ed4bfe1a705 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -46,8 +46,8 @@ use js::jsval::{JSVal, NullValue, UndefinedValue}; use net_traits::ControlMsg::Load; use net_traits::{ResourceTask, ResourceCORSData, LoadData, LoadConsumer}; -use net_traits::{AsyncResponseListener, Metadata, SerializableHeaders, SerializableMethod}; -use net_traits::{SerializableUrl}; +use net_traits::{AsyncResponseListener, AsyncResponseTarget, Metadata, SerializableHeaders}; +use net_traits::{SerializableMethod, SerializableUrl}; use cors::{allow_cross_origin_request, CORSRequest, RequestMode, AsyncCORSResponseListener}; use cors::CORSResponse; use util::str::DOMString; @@ -59,7 +59,7 @@ use std::cell::{RefCell, Cell}; use std::default::Default; use std::sync::{Mutex, Arc}; use std::sync::mpsc::{channel, Sender, TryRecvError}; -use std::thread::sleep_ms; +use std::thread::{self, sleep_ms}; use time; use url::{Url, UrlParser}; @@ -271,11 +271,17 @@ impl XMLHttpRequest { } } + let (action_sender, action_receiver) = channel(); let listener = box NetworkListener { context: context, script_chan: script_chan, + receiver: action_receiver, }; - resource_task.send(Load(load_data, LoadConsumer::Listener(listener))).unwrap(); + let response_target = AsyncResponseTarget { + sender: action_sender, + }; + thread::spawn(move || listener.run()); + resource_task.send(Load(load_data, LoadConsumer::Listener(response_target))).unwrap(); } } |