mirror of
https://github.com/servo/servo.git
synced 2025-06-21 15:49:04 +01:00
remove @ from net/image_cache_task
~[Chan<ImageResponseMsg>] is not freezetype. so we have to use unsafe_access
This commit is contained in:
parent
86e2cac8e8
commit
01a3edd2ac
1 changed files with 22 additions and 13 deletions
|
@ -13,7 +13,7 @@ use std::task::spawn;
|
||||||
use std::to_str::ToStr;
|
use std::to_str::ToStr;
|
||||||
use std::util::replace;
|
use std::util::replace;
|
||||||
use std::result;
|
use std::result;
|
||||||
use extra::arc::Arc;
|
use extra::arc::{Arc,MutexArc};
|
||||||
use extra::url::Url;
|
use extra::url::Url;
|
||||||
|
|
||||||
pub enum Msg {
|
pub enum Msg {
|
||||||
|
@ -148,7 +148,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
|
||||||
wait_map: UrlMap<@mut ~[Chan<ImageResponseMsg>]>,
|
wait_map: UrlMap<MutexArc<~[Chan<ImageResponseMsg>]>>,
|
||||||
need_exit: Option<Chan<()>>,
|
need_exit: Option<Chan<()>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,9 +156,9 @@ struct ImageCache {
|
||||||
enum ImageState {
|
enum ImageState {
|
||||||
Init,
|
Init,
|
||||||
Prefetching(AfterPrefetch),
|
Prefetching(AfterPrefetch),
|
||||||
Prefetched(@Cell<~[u8]>),
|
Prefetched(Cell<~[u8]>),
|
||||||
Decoding,
|
Decoding,
|
||||||
Decoded(@Arc<~Image>),
|
Decoded(Arc<~Image>),
|
||||||
Failed
|
Failed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ impl ImageCache {
|
||||||
|
|
||||||
fn get_state(&self, url: Url) -> ImageState {
|
fn get_state(&self, url: Url) -> ImageState {
|
||||||
match self.state_map.find(&url) {
|
match self.state_map.find(&url) {
|
||||||
Some(state) => *state,
|
Some(state) => state.clone(),
|
||||||
None => Init
|
None => Init
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,7 +275,7 @@ impl ImageCache {
|
||||||
match data {
|
match data {
|
||||||
Ok(data_cell) => {
|
Ok(data_cell) => {
|
||||||
let data = data_cell.take();
|
let data = data_cell.take();
|
||||||
self.set_state(url.clone(), Prefetched(@Cell::new(data)));
|
self.set_state(url.clone(), Prefetched(Cell::new(data)));
|
||||||
match next_step {
|
match next_step {
|
||||||
DoDecode => self.decode(url),
|
DoDecode => self.decode(url),
|
||||||
_ => ()
|
_ => ()
|
||||||
|
@ -347,7 +347,7 @@ impl ImageCache {
|
||||||
Decoding => {
|
Decoding => {
|
||||||
match image {
|
match image {
|
||||||
Some(image) => {
|
Some(image) => {
|
||||||
self.set_state(url.clone(), Decoded(@image.clone()));
|
self.set_state(url.clone(), Decoded(image.clone()));
|
||||||
self.purge_waiters(url, || ImageReady(image.clone()) );
|
self.purge_waiters(url, || ImageReady(image.clone()) );
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
|
@ -371,9 +371,13 @@ impl ImageCache {
|
||||||
fn purge_waiters(&mut self, url: Url, f: &fn() -> ImageResponseMsg) {
|
fn purge_waiters(&mut self, url: Url, f: &fn() -> ImageResponseMsg) {
|
||||||
match self.wait_map.pop(&url) {
|
match self.wait_map.pop(&url) {
|
||||||
Some(waiters) => {
|
Some(waiters) => {
|
||||||
|
unsafe {
|
||||||
|
waiters.unsafe_access( |waiters| {
|
||||||
for response in waiters.iter() {
|
for response in waiters.iter() {
|
||||||
response.send(f());
|
response.send(f());
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => ()
|
None => ()
|
||||||
}
|
}
|
||||||
|
@ -385,7 +389,7 @@ impl ImageCache {
|
||||||
Prefetching(DoDecode) => response.send(ImageNotReady),
|
Prefetching(DoDecode) => response.send(ImageNotReady),
|
||||||
Prefetching(DoNotDecode) | Prefetched(*) => fail!(~"request for image before decode"),
|
Prefetching(DoNotDecode) | Prefetched(*) => fail!(~"request for image before decode"),
|
||||||
Decoding => response.send(ImageNotReady),
|
Decoding => response.send(ImageNotReady),
|
||||||
Decoded(image) => response.send(ImageReady((*image).clone())),
|
Decoded(image) => response.send(ImageReady(image.clone())),
|
||||||
Failed => response.send(ImageFailed),
|
Failed => response.send(ImageFailed),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -400,14 +404,19 @@ impl ImageCache {
|
||||||
// We don't have this image yet
|
// We don't have this image yet
|
||||||
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();
|
||||||
waiters.push(response);
|
unsafe {
|
||||||
|
let res = Cell::new(response);
|
||||||
|
waiters.unsafe_access( |waiters| {
|
||||||
|
waiters.push(res.take());
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
self.wait_map.insert(url, @mut ~[response]);
|
self.wait_map.insert(url, MutexArc::new(~[response]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Decoded(image) => {
|
Decoded(image) => {
|
||||||
response.send(ImageReady((*image).clone()));
|
response.send(ImageReady(image.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Failed => {
|
Failed => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue