mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Do less copying in image_cache_task
This commit is contained in:
parent
127a6ba191
commit
561879848c
1 changed files with 25 additions and 20 deletions
|
@ -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)) );
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue