mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
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:
commit
7b80386047
2 changed files with 9 additions and 6 deletions
|
@ -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.
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue