mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
auto merge of #2476 : glennw/servo/issue-2412, r=huonw
...on bug #2412.
This commit is contained in:
commit
ea00ee8e50
1 changed files with 5 additions and 25 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue