Auto merge of #14048 - antrik:nosync-ipc_sender, r=mbrubeck

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...

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14048)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-11-03 21:37:17 -05:00 committed by GitHub
commit 7b80386047
2 changed files with 9 additions and 6 deletions

View file

@ -77,7 +77,7 @@ pub struct SharedLayoutContext {
pub style_context: SharedStyleContext, pub style_context: SharedStyleContext,
/// The shared image cache thread. /// 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. /// A channel for the image cache to send responses to.
pub image_cache_sender: Mutex<ImageCacheChan>, pub image_cache_sender: Mutex<ImageCacheChan>,
@ -133,7 +133,8 @@ impl SharedLayoutContext {
debug_assert!(opts::get().output_file.is_some() || opts::get().exit_after_load); debug_assert!(opts::get().output_file.is_some() || opts::get().exit_after_load);
// See if the image is already available // 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 { match result {
Ok(image) => return Some(image), Ok(image) => return Some(image),
@ -147,7 +148,7 @@ impl SharedLayoutContext {
// If we are emitting an output file, then we need to block on // 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. // image load or we risk emitting an output file missing the image.
let (sync_tx, sync_rx) = ipc::channel().unwrap(); 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 { loop {
match sync_rx.recv() { match sync_rx.recv() {
Err(_) => return None, Err(_) => return None,
@ -171,7 +172,8 @@ impl SharedLayoutContext {
.map(|img| ImageOrMetadataAvailable::ImageAvailable(img)); .map(|img| ImageOrMetadataAvailable::ImageAvailable(img));
} }
// See if the image is already available // 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); use_placeholder);
match result { match result {
Ok(image_or_metadata) => Some(image_or_metadata), Ok(image_or_metadata) => Some(image_or_metadata),
@ -180,7 +182,8 @@ impl SharedLayoutContext {
// Not yet requested, async mode - request image or metadata from the cache // Not yet requested, async mode - request image or metadata from the cache
Err(ImageState::NotRequested) => { Err(ImageState::NotRequested) => {
let sender = self.image_cache_sender.lock().unwrap().clone(); 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 None
} }
// Image has been requested, is still pending. Return no image for this paint loop. // Image has been requested, is still pending. Return no image for this paint loop.

View file

@ -511,7 +511,7 @@ impl LayoutThread {
local_context_creation_data: Mutex::new(local_style_context_creation_data), local_context_creation_data: Mutex::new(local_style_context_creation_data),
timer: self.timer.clone(), timer: self.timer.clone(),
}, },
image_cache_thread: self.image_cache_thread.clone(), image_cache_thread: Mutex::new(self.image_cache_thread.clone()),
image_cache_sender: Mutex::new(self.image_cache_sender.clone()), image_cache_sender: Mutex::new(self.image_cache_sender.clone()),
font_cache_thread: Mutex::new(self.font_cache_thread.clone()), font_cache_thread: Mutex::new(self.font_cache_thread.clone()),
webrender_image_cache: self.webrender_image_cache.clone(), webrender_image_cache: self.webrender_image_cache.clone(),