mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Some refactoring of ImageCache
This commit is contained in:
parent
872a82b9f0
commit
d723e0cf7b
1 changed files with 60 additions and 57 deletions
|
@ -55,68 +55,71 @@ impl ImageCache {
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
match self.from_client.recv() {
|
match self.from_client.recv() {
|
||||||
Prefetch(url) => {
|
Prefetch(url) => self.prefetch(url),
|
||||||
if self.prefetch_map.contains_key(url) {
|
GetImage(url, response) => self.get_image(url, response),
|
||||||
// We're already waiting for this image
|
|
||||||
again
|
|
||||||
}
|
|
||||||
let response_port = port();
|
|
||||||
self.resource_task.send(resource_task::Load(url, response_port.chan()));
|
|
||||||
|
|
||||||
let prefetch_data = @PrefetchData {
|
|
||||||
response_port: response_port,
|
|
||||||
data: ~[]
|
|
||||||
};
|
|
||||||
|
|
||||||
self.prefetch_map.insert(url, prefetch_data);
|
|
||||||
}
|
|
||||||
GetImage(url, response) => {
|
|
||||||
match self.prefetch_map.find(url) {
|
|
||||||
some(prefetch_data) => {
|
|
||||||
|
|
||||||
let mut image_sent = false;
|
|
||||||
|
|
||||||
while prefetch_data.response_port.peek() {
|
|
||||||
match prefetch_data.response_port.recv() {
|
|
||||||
resource_task::Payload(data) => {
|
|
||||||
prefetch_data.data += data;
|
|
||||||
}
|
|
||||||
resource_task::Done(result::ok(*)) => {
|
|
||||||
// We've got the entire image binary
|
|
||||||
let mut data = ~[];
|
|
||||||
data <-> prefetch_data.data;
|
|
||||||
// FIXME: Need to do this in parallel
|
|
||||||
let image = @arc(~load_from_memory(data));
|
|
||||||
response.send(ImageReady(clone_arc(image)));
|
|
||||||
self.prefetch_map.remove(url);
|
|
||||||
self.image_map.insert(url, image);
|
|
||||||
image_sent = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
resource_task::Done(result::err(*)) => {
|
|
||||||
fail ~"FIXME: what happens now?"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !image_sent {
|
|
||||||
response.send(ImageNotReady);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
none => {
|
|
||||||
// FIXME: Probably faster to hit this map before the prefetch map
|
|
||||||
match self.image_map.find(url) {
|
|
||||||
some(image) => response.send(ImageReady(clone_arc(image))),
|
|
||||||
none => fail ~"got a request for image data without prefetch"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Exit => break
|
Exit => break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*priv*/ fn prefetch(url: url) {
|
||||||
|
if self.prefetch_map.contains_key(url) {
|
||||||
|
// We're already waiting for this image
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let response_port = port();
|
||||||
|
self.resource_task.send(resource_task::Load(url, response_port.chan()));
|
||||||
|
|
||||||
|
let prefetch_data = @PrefetchData {
|
||||||
|
response_port: response_port,
|
||||||
|
data: ~[]
|
||||||
|
};
|
||||||
|
|
||||||
|
self.prefetch_map.insert(url, prefetch_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*priv*/ fn get_image(url: url, response: chan<ImageResponseMsg>) {
|
||||||
|
match self.prefetch_map.find(url) {
|
||||||
|
some(prefetch_data) => {
|
||||||
|
|
||||||
|
let mut image_sent = false;
|
||||||
|
|
||||||
|
while prefetch_data.response_port.peek() {
|
||||||
|
match prefetch_data.response_port.recv() {
|
||||||
|
resource_task::Payload(data) => {
|
||||||
|
prefetch_data.data += data;
|
||||||
|
}
|
||||||
|
resource_task::Done(result::ok(*)) => {
|
||||||
|
// We've got the entire image binary
|
||||||
|
let mut data = ~[];
|
||||||
|
data <-> prefetch_data.data;
|
||||||
|
// FIXME: Need to do this in parallel
|
||||||
|
let image = @arc(~load_from_memory(data));
|
||||||
|
response.send(ImageReady(clone_arc(image)));
|
||||||
|
self.prefetch_map.remove(url);
|
||||||
|
self.image_map.insert(url, image);
|
||||||
|
image_sent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
resource_task::Done(result::err(*)) => {
|
||||||
|
fail ~"FIXME: what happens now?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !image_sent {
|
||||||
|
response.send(ImageNotReady);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
none => {
|
||||||
|
// FIXME: Probably faster to hit this map before the prefetch map
|
||||||
|
match self.image_map.find(url) {
|
||||||
|
some(image) => response.send(ImageReady(clone_arc(image))),
|
||||||
|
none => fail ~"got a request for image data without prefetch"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue