From d723e0cf7b3263d194092e250c619a86cbbcb5ad Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 10 Aug 2012 15:59:41 -0700 Subject: [PATCH] Some refactoring of ImageCache --- src/servo/resource/image_cache_task.rs | 117 +++++++++++++------------ 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/src/servo/resource/image_cache_task.rs b/src/servo/resource/image_cache_task.rs index f164c5e71cb..aa35990fbda 100644 --- a/src/servo/resource/image_cache_task.rs +++ b/src/servo/resource/image_cache_task.rs @@ -55,68 +55,71 @@ impl ImageCache { loop { match self.from_client.recv() { - Prefetch(url) => { - if self.prefetch_map.contains_key(url) { - // 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" - } - } - } - } + Prefetch(url) => self.prefetch(url), + GetImage(url, response) => self.get_image(url, response), 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) { + 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]