diff options
author | Olaf Buddenhagen <antrik@users.sf.net> | 2016-11-02 17:39:03 +0100 |
---|---|---|
committer | Olaf Buddenhagen <antrik@users.sf.net> | 2016-11-03 16:24:20 +0100 |
commit | 4d14f1eb67798ec13e7a8f45c5c59a3cc8433423 (patch) | |
tree | d3e852f02c97548de49026dfb61a7680b78b772d /components/layout/context.rs | |
parent | 291f393723d22a582bb9a49ef7294ec14eca2127 (diff) | |
download | servo-4d14f1eb67798ec13e7a8f45c5c59a3cc8433423.tar.gz servo-4d14f1eb67798ec13e7a8f45c5c59a3cc8433423.zip |
layout/context: Wrap `image_cache_thread` in a `Mutex<>` as well
`SharedLayoutContext.image_cache_thread` didn't get the `Mutex<>`
treatment along with all the other channels in there, because
`ipc-channel::Sender` is presently inherently `Sync`. I believe this to
be an implementation accident though, that should be rectified in the
future -- not something users should actually rely on...
Note that sharing senders (be it `mpsc` or `ipc-channel`) in is probably
not a good idea anyway: just cloning them -- and letting them handle the
sharing internally -- should be both simpler and cheaper. But right now
that's how things are handled here; so let's go with the flow...
Diffstat (limited to 'components/layout/context.rs')
-rw-r--r-- | components/layout/context.rs | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/components/layout/context.rs b/components/layout/context.rs index 17a484e2930..c2669755af9 100644 --- a/components/layout/context.rs +++ b/components/layout/context.rs @@ -76,7 +76,7 @@ pub struct SharedLayoutContext { pub style_context: SharedStyleContext, /// The shared image cache thread. - pub image_cache_thread: ImageCacheThread, + pub image_cache_thread: Mutex<ImageCacheThread>, /// A channel for the image cache to send responses to. pub image_cache_sender: Mutex<ImageCacheChan>, @@ -132,7 +132,8 @@ impl SharedLayoutContext { debug_assert!(opts::get().output_file.is_some() || opts::get().exit_after_load); // See if the image is already available - let result = self.image_cache_thread.find_image(url.clone(), use_placeholder); + let result = self.image_cache_thread.lock().unwrap() + .find_image(url.clone(), use_placeholder); match result { Ok(image) => return Some(image), @@ -146,7 +147,7 @@ impl SharedLayoutContext { // If we are emitting an output file, then we need to block on // image load or we risk emitting an output file missing the image. let (sync_tx, sync_rx) = ipc::channel().unwrap(); - self.image_cache_thread.request_image(url, ImageCacheChan(sync_tx), None); + self.image_cache_thread.lock().unwrap().request_image(url, ImageCacheChan(sync_tx), None); loop { match sync_rx.recv() { Err(_) => return None, @@ -170,7 +171,8 @@ impl SharedLayoutContext { .map(|img| ImageOrMetadataAvailable::ImageAvailable(img)); } // See if the image is already available - let result = self.image_cache_thread.find_image_or_metadata(url.clone(), + let result = self.image_cache_thread.lock().unwrap() + .find_image_or_metadata(url.clone(), use_placeholder); match result { Ok(image_or_metadata) => Some(image_or_metadata), @@ -179,7 +181,8 @@ impl SharedLayoutContext { // Not yet requested, async mode - request image or metadata from the cache Err(ImageState::NotRequested) => { let sender = self.image_cache_sender.lock().unwrap().clone(); - self.image_cache_thread.request_image_and_metadata(url, sender, None); + self.image_cache_thread.lock().unwrap() + .request_image_and_metadata(url, sender, None); None } // Image has been requested, is still pending. Return no image for this paint loop. |