Do less copying in image_cache_task

This commit is contained in:
Brian Anderson 2012-10-12 15:20:17 -07:00
parent 127a6ba191
commit 561879848c

View file

@ -1,3 +1,4 @@
use core::util::replace;
use image::base::{Image, load_from_memory, test_image_bin}; use image::base::{Image, load_from_memory, test_image_bin};
use std::net::url::Url; use std::net::url::Url;
use util::url::{make_url, UrlMap, url_map}; use util::url::{make_url, UrlMap, url_map};
@ -15,6 +16,7 @@ pub enum Msg {
/// before Decode /// before Decode
pub Prefetch(Url), pub Prefetch(Url),
// FIXME: We can probably get rid of this Cell now
/// Used be the prefetch tasks to post back image binaries /// Used be the prefetch tasks to post back image binaries
priv StorePrefetchedImageData(Url, Result<Cell<~[u8]>, ()>), priv StorePrefetchedImageData(Url, Result<Cell<~[u8]>, ()>),
@ -104,13 +106,13 @@ fn SyncImageCacheTask(resource_task: ResourceTask) -> ImageCacheTask {
loop { loop {
let msg = from_client.recv(); let msg = from_client.recv();
match msg { match move msg {
GetImage(url, response) => inner_cache.send(WaitForImage(copy url, response)), GetImage(move url, move response) => inner_cache.send(WaitForImage(url, response)),
Exit(response) => { Exit(move response) => {
inner_cache.send(Exit(response)); inner_cache.send(Exit(response));
break; break;
} }
_ => inner_cache.send(msg) move msg => inner_cache.send(msg)
} }
} }
} }
@ -158,23 +160,24 @@ impl ImageCache {
#debug("image_cache_task: received: %?", msg); #debug("image_cache_task: received: %?", msg);
// FIXME: Need to move out the urls match move msg {
match msg { Prefetch(move url) => self.prefetch(url),
Prefetch(url) => self.prefetch(copy url), StorePrefetchedImageData(move url, move data) => self.store_prefetched_image_data(url, data),
StorePrefetchedImageData(url, data) => self.store_prefetched_image_data(copy url, &data), Decode(move url) => self.decode(url),
Decode(url) => self.decode(copy url), StoreImage(move url, move image) => self.store_image(url, image),
StoreImage(url, image) => self.store_image(copy url, &image), GetImage(move url, move response) => self.get_image(url, response),
GetImage(url, response) => self.get_image(copy url, response), WaitForImage(move url, move response) => self.wait_for_image(url, response),
WaitForImage(url, response) => self.wait_for_image(copy url, response), OnMsg(move handler) => msg_handlers += [copy handler],
OnMsg(handler) => msg_handlers += [copy handler], Exit(move response) => {
Exit(response) => {
assert self.need_exit.is_none(); assert self.need_exit.is_none();
self.need_exit = Some(response); self.need_exit = Some(response);
} }
} }
match copy self.need_exit { let need_exit = replace(&mut self.need_exit, None);
Some(response) => {
match move need_exit {
Some(move response) => {
// Wait until we have no outstanding requests and subtasks // Wait until we have no outstanding requests and subtasks
// before exiting // before exiting
let mut can_exit = true; let mut can_exit = true;
@ -193,6 +196,8 @@ impl ImageCache {
if can_exit { if can_exit {
response.send(()); response.send(());
break; break;
} else {
self.need_exit = Some(move response);
} }
} }
None => () None => ()
@ -246,10 +251,10 @@ impl ImageCache {
} }
} }
priv fn store_prefetched_image_data(url: Url, data: &Result<Cell<~[u8]>, ()>) { priv fn store_prefetched_image_data(url: Url, data: Result<Cell<~[u8]>, ()>) {
match self.get_state(copy url) { match self.get_state(copy url) {
Prefetching(next_step) => { Prefetching(next_step) => {
match *data { match data {
Ok(data_cell) => { Ok(data_cell) => {
let data = data_cell.take(); let data = data_cell.take();
self.set_state(copy url, Prefetched(@Cell(data))); self.set_state(copy url, Prefetched(@Cell(data)));
@ -321,11 +326,11 @@ impl ImageCache {
} }
} }
priv fn store_image(url: Url, image: &Option<ARC<~Image>>) { priv fn store_image(url: Url, image: Option<ARC<~Image>>) {
match self.get_state(copy url) { match self.get_state(copy url) {
Decoding => { Decoding => {
match *image { match image {
Some(image) => { Some(image) => {
self.set_state(copy url, Decoded(@clone_arc(&image))); self.set_state(copy url, Decoded(@clone_arc(&image)));
self.purge_waiters(url, || ImageReady(clone_arc(&image)) ); self.purge_waiters(url, || ImageReady(clone_arc(&image)) );