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/net/image_cache_task.rs | |
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/net/image_cache_task.rs')
-rw-r--r-- | components/net/image_cache_task.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/components/net/image_cache_task.rs b/components/net/image_cache_task.rs index 865e8c6e37b..827aa4a24aa 100644 --- a/components/net/image_cache_task.rs +++ b/components/net/image_cache_task.rs @@ -14,6 +14,7 @@ use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::mem; use std::sync::Arc; use std::sync::mpsc::{channel, Sender, Receiver, Select}; +use std::thread; use util::resource_files::resources_dir_path; use util::task::spawn_named; use util::taskpool::TaskPool; @@ -100,14 +101,17 @@ struct ResourceLoadInfo { struct ResourceListener { url: Url, sender: Sender<ResourceLoadInfo>, + receiver: Receiver<ResponseAction>, } -impl AsyncResponseTarget for ResourceListener { - fn invoke_with_listener(&self, action: ResponseAction) { - self.sender.send(ResourceLoadInfo { - action: action, - url: self.url.clone(), - }).unwrap(); +impl ResourceListener { + fn run(&self) { + while let Ok(action) = self.receiver.recv() { + self.sender.send(ResourceLoadInfo { + action: action, + url: self.url.clone(), + }).unwrap(); + } } } @@ -330,11 +334,17 @@ impl ImageCache { e.insert(pending_load); let load_data = LoadData::new(url.clone(), None); + let (action_sender, action_receiver) = channel(); let listener = box ResourceListener { url: url, sender: self.progress_sender.clone(), + receiver: action_receiver, }; - let msg = ControlMsg::Load(load_data, LoadConsumer::Listener(listener)); + let msg = ControlMsg::Load(load_data, + LoadConsumer::Listener(AsyncResponseTarget { + sender: action_sender, + })); + thread::spawn(move || listener.run()); self.resource_task.send(msg).unwrap(); } } |