auto merge of #2476 : glennw/servo/issue-2412, r=huonw

...on bug #2412.
This commit is contained in:
bors-servo 2014-05-26 03:07:23 -04:00
commit ea00ee8e50

View file

@ -7,7 +7,6 @@ use resource_task;
use resource_task::ResourceTask; use resource_task::ResourceTask;
use servo_util::url::{UrlMap, url_map}; use servo_util::url::{UrlMap, url_map};
use std::cast;
use std::comm::{channel, Receiver, Sender}; use std::comm::{channel, Receiver, Sender};
use std::mem::replace; use std::mem::replace;
use std::task::spawn; use std::task::spawn;
@ -144,8 +143,7 @@ struct ImageCache {
/// The state of processsing an image for a URL /// The state of processsing an image for a URL
state_map: UrlMap<ImageState>, state_map: UrlMap<ImageState>,
/// List of clients waiting on a WaitForImage response /// List of clients waiting on a WaitForImage response
// FIXME(rust#13125): Remove the *() for the real type. wait_map: UrlMap<Arc<Mutex<Vec<Sender<ImageResponseMsg>>>>>,
wait_map: UrlMap<Arc<Mutex<*()>>>,
need_exit: Option<Sender<()>>, need_exit: Option<Sender<()>>,
} }
@ -373,17 +371,10 @@ impl ImageCache {
fn purge_waiters(&mut self, url: Url, f: || -> ImageResponseMsg) { fn purge_waiters(&mut self, url: Url, f: || -> ImageResponseMsg) {
match self.wait_map.pop(&url) { match self.wait_map.pop(&url) {
Some(waiters) => { Some(waiters) => {
let val = waiters.lock(); let mut items = waiters.lock();
let items = unsafe {
cast::transmute::<*(), Box<Vec<Sender<ImageResponseMsg>>>>(*val)
};
for response in items.iter() { for response in items.iter() {
response.send(f()); response.send(f());
} }
let _ = unsafe {
// Cast back to avoid the drop at the end.
cast::transmute::<Box<Vec<Sender<ImageResponseMsg>>>, *()>(items)
};
} }
None => () None => ()
} }
@ -411,22 +402,11 @@ impl ImageCache {
if self.wait_map.contains_key(&url) { if self.wait_map.contains_key(&url) {
let waiters = self.wait_map.find_mut(&url).unwrap(); let waiters = self.wait_map.find_mut(&url).unwrap();
let mut response = Some(response); let mut response = Some(response);
let val = waiters.lock(); let mut items = waiters.lock();
let mut items = unsafe {
cast::transmute::<*(), Box<Vec<Sender<ImageResponseMsg>>>>(*val)
};
items.push(response.take().unwrap()); items.push(response.take().unwrap());
let _ = unsafe {
// Cast back to avoid the drop at the end.
cast::transmute::<Box<Vec<Sender<ImageResponseMsg>>>, *()>(items)
};
} else { } else {
let response = box vec!(response); let response = vec!(response);
let wrapped = unsafe { let wrapped = Arc::new(Mutex::new(response));
Arc::new(Mutex::new(
cast::transmute::<Box<Vec<Sender<ImageResponseMsg>>>, *()>(response)))
};
self.wait_map.insert(url, wrapped); self.wait_map.insert(url, wrapped);
} }
} }