diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-07-31 11:48:47 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-07-31 15:03:39 -0700 |
commit | 61e3a9545ecd3b93e275af6dfa425a7fdd42f9db (patch) | |
tree | f426bc8f8aae487096d302f89e732daef2f73646 | |
parent | 024c4df912a01be6d2909f4402ad2791f53e0dce (diff) | |
download | servo-61e3a9545ecd3b93e275af6dfa425a7fdd42f9db.tar.gz servo-61e3a9545ecd3b93e275af6dfa425a7fdd42f9db.zip |
script: Fix test failures.
-rw-r--r-- | components/script/document_loader.rs | 11 | ||||
-rw-r--r-- | components/script/dom/bindings/global.rs | 2 | ||||
-rw-r--r-- | components/script/dom/window.rs | 9 | ||||
-rw-r--r-- | components/script/network_listener.rs | 6 | ||||
-rw-r--r-- | components/script/script_task.rs | 9 |
5 files changed, 23 insertions, 14 deletions
diff --git a/components/script/document_loader.rs b/components/script/document_loader.rs index 439fc98367a..56ee98bdbbf 100644 --- a/components/script/document_loader.rs +++ b/components/script/document_loader.rs @@ -9,6 +9,7 @@ use script_task::{ScriptMsg, ScriptChan}; use msg::constellation_msg::{PipelineId}; use net_traits::{Metadata, load_whole_resource, ResourceTask, PendingAsyncLoad}; use net_traits::AsyncResponseTarget; +use std::sync::Arc; use url::Url; #[derive(JSTraceable, PartialEq, Clone, Debug)] @@ -34,7 +35,9 @@ impl LoadType { #[derive(JSTraceable)] pub struct DocumentLoader { - pub resource_task: ResourceTask, + /// We use an `Arc<ResourceTask>` here in order to avoid file descriptor exhaustion when there + /// are lots of iframes. + pub resource_task: Arc<ResourceTask>, notifier_data: Option<NotifierData>, blocking_loads: Vec<LoadType>, } @@ -50,7 +53,9 @@ impl DocumentLoader { DocumentLoader::new_with_task(existing.resource_task.clone(), None, None) } - pub fn new_with_task(resource_task: ResourceTask, + /// We use an `Arc<ResourceTask>` here in order to avoid file descriptor exhaustion when there + /// are lots of iframes. + pub fn new_with_task(resource_task: Arc<ResourceTask>, data: Option<NotifierData>, initial_load: Option<Url>,) -> DocumentLoader { @@ -69,7 +74,7 @@ impl DocumentLoader { let url = load.url().clone(); self.blocking_loads.push(load); let pipeline = self.notifier_data.as_ref().map(|data| data.pipeline); - PendingAsyncLoad::new(self.resource_task.clone(), url, pipeline) + PendingAsyncLoad::new((*self.resource_task).clone(), url, pipeline) } /// Create and initiate a new network request. diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 5f0f7668af4..cfdd3df4af5 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -116,7 +116,7 @@ impl<'a> GlobalRef<'a> { let doc = window.Document(); let doc = doc.r(); let loader = doc.loader(); - loader.resource_task.clone() + (*loader.resource_task).clone() } GlobalRef::Worker(ref worker) => worker.resource_task().clone(), } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index d4f2a36eabf..d7a9e9f243a 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -74,8 +74,9 @@ use std::default::Default; use std::ffi::CString; use std::mem as std_mem; use std::rc::Rc; -use std::sync::mpsc::{channel, Receiver}; +use std::sync::Arc; use std::sync::mpsc::TryRecvError::{Empty, Disconnected}; +use std::sync::mpsc::{channel, Receiver}; use time; /// Current state of the window object @@ -173,7 +174,7 @@ pub struct Window { window_size: Cell<Option<WindowSizeData>>, /// Associated resource task for use by DOM objects like XMLHttpRequest - resource_task: ResourceTask, + resource_task: Arc<ResourceTask>, /// A handle for communicating messages to the storage task. storage_task: StorageTask, @@ -883,7 +884,7 @@ impl<'a> WindowHelpers for &'a Window { } fn resource_task(self) -> ResourceTask { - self.resource_task.clone() + (*self.resource_task).clone() } fn mem_profiler_chan(self) -> mem::ProfilerChan { @@ -1035,7 +1036,7 @@ impl Window { control_chan: ScriptControlChan, compositor: ScriptListener, image_cache_task: ImageCacheTask, - resource_task: ResourceTask, + resource_task: Arc<ResourceTask>, storage_task: StorageTask, mem_profiler_chan: mem::ProfilerChan, devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>, diff --git a/components/script/network_listener.rs b/components/script/network_listener.rs index cd69b3a030f..7ede86e0742 100644 --- a/components/script/network_listener.rs +++ b/components/script/network_listener.rs @@ -15,10 +15,12 @@ pub struct NetworkListener<T: AsyncResponseListener + PreInvoke + Send + 'static impl<T: AsyncResponseListener + PreInvoke + Send + 'static> NetworkListener<T> { pub fn notify(&self, action: ResponseAction) { - self.script_chan.send(ScriptMsg::RunnableMsg(box ListenerRunnable { + if let Err(err) = self.script_chan.send(ScriptMsg::RunnableMsg(box ListenerRunnable { context: self.context.clone(), action: action, - })).unwrap(); + })) { + warn!("failed to deliver network data: {:?}", err); + } } } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 46796d76dbd..bf23bca2db6 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -287,8 +287,9 @@ pub struct ScriptTask { incomplete_loads: DOMRefCell<Vec<InProgressLoad>>, /// A handle to the image cache task. image_cache_task: ImageCacheTask, - /// A handle to the resource task. - resource_task: ResourceTask, + /// A handle to the resource task. This is an `Arc` to avoid running out of file descriptors if + /// there are many iframes. + resource_task: Arc<ResourceTask>, /// A handle to the storage task. storage_task: StorageTask, @@ -418,7 +419,7 @@ impl ScriptTaskFactory for ScriptTask { control_chan, control_port, constellation_chan, - resource_task, + Arc::new(resource_task), storage_task, image_cache_task, mem_profiler_chan.clone(), @@ -504,7 +505,7 @@ impl ScriptTask { control_chan: ScriptControlChan, control_port: Receiver<ConstellationControlMsg>, constellation_chan: ConstellationChan, - resource_task: ResourceTask, + resource_task: Arc<ResourceTask>, storage_task: StorageTask, image_cache_task: ImageCacheTask, mem_profiler_chan: mem::ProfilerChan, |