mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
net: Use a thread for each AsyncResponseTarget
to avoid having to send
trait objects across process boundaries.
This commit is contained in:
parent
9c9d7dc93b
commit
44d13f7fd4
10 changed files with 78 additions and 31 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue