aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/image_cache_task.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2015-07-09 16:50:06 -0700
committerPatrick Walton <pcwalton@mimiga.net>2015-07-31 11:27:49 -0700
commit44d13f7fd419bdff1420ed21ca3efd72f4015bfa (patch)
treeeef95c16a10775746262be4eb8fae0859b7ae15d /components/net/image_cache_task.rs
parent9c9d7dc93b1d64b1524eb2bdcbdc817319abc8b9 (diff)
downloadservo-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.rs24
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();
}
}