mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Copy fewer urls in the image cache
This commit is contained in:
parent
91b566cffd
commit
fa8fd4d243
1 changed files with 20 additions and 17 deletions
|
@ -12,6 +12,7 @@ import resource::resource_task;
|
||||||
import resource_task::ResourceTask;
|
import resource_task::ResourceTask;
|
||||||
import std::arc::arc;
|
import std::arc::arc;
|
||||||
import clone_arc = std::arc::clone;
|
import clone_arc = std::arc::clone;
|
||||||
|
import std::cell::Cell;
|
||||||
|
|
||||||
enum Msg {
|
enum Msg {
|
||||||
/// Tell the cache that we may need a particular image soon. Must be posted
|
/// Tell the cache that we may need a particular image soon. Must be posted
|
||||||
|
@ -73,28 +74,29 @@ impl ImageCache {
|
||||||
fn run() {
|
fn run() {
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
// FIXME: Need to move out the urls
|
||||||
match self.from_client.recv() {
|
match self.from_client.recv() {
|
||||||
Prefetch(url) => self.prefetch(url),
|
Prefetch(url) => self.prefetch(copy url),
|
||||||
GetImage(url, response) => self.get_image(url, response),
|
GetImage(url, response) => self.get_image(copy url, response),
|
||||||
StoreImage(url, image) => self.store_image(url, &image),
|
StoreImage(url, image) => self.store_image(copy url, &image),
|
||||||
Exit => break
|
Exit => break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*priv*/ fn get_state(url: url) -> ImageState {
|
/*priv*/ fn get_state(+url: url) -> ImageState {
|
||||||
match self.state_map.find(copy url) {
|
match self.state_map.find(url) {
|
||||||
some(state) => state,
|
some(state) => state,
|
||||||
none => Init
|
none => Init
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*priv*/ fn set_state(url: url, state: ImageState) {
|
/*priv*/ fn set_state(+url: url, state: ImageState) {
|
||||||
self.state_map.insert(copy url, state);
|
self.state_map.insert(url, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*priv*/ fn prefetch(url: url) {
|
/*priv*/ fn prefetch(+url: url) {
|
||||||
match self.get_state(url) {
|
match self.get_state(copy url) {
|
||||||
Init => {
|
Init => {
|
||||||
let response_port = port();
|
let response_port = port();
|
||||||
self.resource_task.send(resource_task::Load(copy url, response_port.chan()));
|
self.resource_task.send(resource_task::Load(copy url, response_port.chan()));
|
||||||
|
@ -116,9 +118,9 @@ impl ImageCache {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*priv*/ fn get_image(url: url, response: chan<ImageResponseMsg>) {
|
/*priv*/ fn get_image(+url: url, response: chan<ImageResponseMsg>) {
|
||||||
|
|
||||||
match self.get_state(url) {
|
match self.get_state(copy url) {
|
||||||
Init => fail ~"Request for image before prefetch",
|
Init => fail ~"Request for image before prefetch",
|
||||||
|
|
||||||
Prefetching(prefetch_data) => {
|
Prefetching(prefetch_data) => {
|
||||||
|
@ -138,18 +140,19 @@ impl ImageCache {
|
||||||
|
|
||||||
let to_cache = self.from_client.chan();
|
let to_cache = self.from_client.chan();
|
||||||
|
|
||||||
do spawn |copy url| {
|
let url_cell = Cell(copy url);
|
||||||
|
do spawn |move url_cell| {
|
||||||
let image = arc(~load_from_memory(data));
|
let image = arc(~load_from_memory(data));
|
||||||
// Send the image to the original requester
|
// Send the image to the original requester
|
||||||
response.send(ImageReady(clone_arc(&image)));
|
response.send(ImageReady(clone_arc(&image)));
|
||||||
to_cache.send(StoreImage(copy url, clone_arc(&image)));
|
to_cache.send(StoreImage(url_cell.take(), clone_arc(&image)));
|
||||||
}
|
}
|
||||||
|
|
||||||
let future_data = @FutureData {
|
let future_data = @FutureData {
|
||||||
waiters: ~[]
|
waiters: ~[]
|
||||||
};
|
};
|
||||||
|
|
||||||
self.set_state(copy url, Decoding(future_data));
|
self.set_state(url, Decoding(future_data));
|
||||||
|
|
||||||
image_sent = true;
|
image_sent = true;
|
||||||
break;
|
break;
|
||||||
|
@ -158,7 +161,7 @@ impl ImageCache {
|
||||||
// There was an error loading the image binary. Put it
|
// There was an error loading the image binary. Put it
|
||||||
// in the error map so we remember the error for future
|
// in the error map so we remember the error for future
|
||||||
// requests.
|
// requests.
|
||||||
self.set_state(copy url, Failed);
|
self.set_state(url, Failed);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -185,9 +188,9 @@ impl ImageCache {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*priv*/ fn store_image(url: url, image: &arc<~Image>) {
|
/*priv*/ fn store_image(+url: url, image: &arc<~Image>) {
|
||||||
|
|
||||||
match self.get_state(url) {
|
match self.get_state(copy url) {
|
||||||
Decoding(future_data) => {
|
Decoding(future_data) => {
|
||||||
|
|
||||||
let mut waiters = ~[];
|
let mut waiters = ~[];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue