script: Make the resource task communication use IPC channels.

This commit is contained in:
Patrick Walton 2015-07-09 17:16:21 -07:00
parent 44d13f7fd4
commit 2aa5174246
35 changed files with 234 additions and 458 deletions

View file

@ -14,7 +14,6 @@ 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;
@ -98,23 +97,6 @@ struct ResourceLoadInfo {
url: Url,
}
struct ResourceListener {
url: Url,
sender: Sender<ResourceLoadInfo>,
receiver: Receiver<ResponseAction>,
}
impl ResourceListener {
fn run(&self) {
while let Ok(action) = self.receiver.recv() {
self.sender.send(ResourceLoadInfo {
action: action,
url: self.url.clone(),
}).unwrap();
}
}
}
/// Implementation of the image cache
struct ImageCache {
// Receive commands from clients
@ -252,10 +234,10 @@ impl ImageCache {
pending_load.bytes.push_all(&data);
}
ResponseAction::ResponseComplete(result) => {
match *result {
match result {
Ok(()) => {
let pending_load = self.pending_loads.get_mut(&msg.url).unwrap();
pending_load.result = Some((*result).clone());
pending_load.result = Some(result);
let bytes = mem::replace(&mut pending_load.bytes, vec!());
let url = msg.url.clone();
@ -334,17 +316,20 @@ 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 (action_sender, action_receiver) = ipc::channel().unwrap();
let response_target = AsyncResponseTarget {
sender: action_sender,
};
let msg = ControlMsg::Load(load_data,
LoadConsumer::Listener(AsyncResponseTarget {
sender: action_sender,
}));
thread::spawn(move || listener.run());
LoadConsumer::Listener(response_target));
let progress_sender = self.progress_sender.clone();
ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
let action: ResponseAction = message.to().unwrap();
progress_sender.send(ResourceLoadInfo {
action: action,
url: url.clone(),
}).unwrap();
});
self.resource_task.send(msg).unwrap();
}
}