Skip to content

Commit

Permalink
Merge pull request servo#1347 from ksh8281/remove_@_from_net_image_ca…
Browse files Browse the repository at this point in the history
…che_task

remove @ from net/image_cache_task
  • Loading branch information
larsbergstrom committed Dec 7, 2013
2 parents 403958a + 01a3edd commit 030e307
Showing 1 changed file with 22 additions and 13 deletions.
35 changes: 22 additions & 13 deletions src/components/net/image_cache_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use std::task::spawn;
use std::to_str::ToStr;
use std::util::replace;
use std::result;
use extra::arc::Arc;
use extra::arc::{Arc,MutexArc};
use extra::url::Url;

pub enum Msg {
Expand Down Expand Up @@ -148,17 +148,17 @@ struct ImageCache {
/// The state of processsing an image for a URL
state_map: UrlMap<ImageState>,
/// List of clients waiting on a WaitForImage response
wait_map: UrlMap<@mut ~[Chan<ImageResponseMsg>]>,
wait_map: UrlMap<MutexArc<~[Chan<ImageResponseMsg>]>>,
need_exit: Option<Chan<()>>,
}

#[deriving(Clone)]
enum ImageState {
Init,
Prefetching(AfterPrefetch),
Prefetched(@Cell<~[u8]>),
Prefetched(Cell<~[u8]>),
Decoding,
Decoded(@Arc<~Image>),
Decoded(Arc<~Image>),
Failed
}

Expand Down Expand Up @@ -229,7 +229,7 @@ impl ImageCache {

fn get_state(&self, url: Url) -> ImageState {
match self.state_map.find(&url) {
Some(state) => *state,
Some(state) => state.clone(),
None => Init
}
}
Expand Down Expand Up @@ -275,7 +275,7 @@ impl ImageCache {
match data {
Ok(data_cell) => {
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 {
DoDecode => self.decode(url),
_ => ()
Expand Down Expand Up @@ -347,7 +347,7 @@ impl ImageCache {
Decoding => {
match 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()) );
}
None => {
Expand All @@ -371,8 +371,12 @@ impl ImageCache {
fn purge_waiters(&mut self, url: Url, f: &fn() -> ImageResponseMsg) {
match self.wait_map.pop(&url) {
Some(waiters) => {
for response in waiters.iter() {
response.send(f());
unsafe {
waiters.unsafe_access( |waiters| {
for response in waiters.iter() {
response.send(f());
}
})
}
}
None => ()
Expand All @@ -385,7 +389,7 @@ impl ImageCache {
Prefetching(DoDecode) => response.send(ImageNotReady),
Prefetching(DoNotDecode) | Prefetched(*) => fail!(~"request for image before decode"),
Decoding => response.send(ImageNotReady),
Decoded(image) => response.send(ImageReady((*image).clone())),
Decoded(image) => response.send(ImageReady(image.clone())),
Failed => response.send(ImageFailed),
}
}
Expand All @@ -400,14 +404,19 @@ impl ImageCache {
// We don't have this image yet
if self.wait_map.contains_key(&url) {
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 {
self.wait_map.insert(url, @mut ~[response]);
self.wait_map.insert(url, MutexArc::new(~[response]));
}
}

Decoded(image) => {
response.send(ImageReady((*image).clone()));
response.send(ImageReady(image.clone()));
}

Failed => {
Expand Down

0 comments on commit 030e307

Please sign in to comment.