aboutsummaryrefslogtreecommitdiffstats
path: root/components/net
diff options
context:
space:
mode:
authorBurtonQin <bobbqqin@gmail.com>2022-10-05 12:52:16 -0400
committerBurtonQin <bobbqqin@gmail.com>2022-10-10 05:36:36 +0000
commit1552e1baa27577c0aa9a69545112d281823ebc6f (patch)
tree50b4ea7e234c4fefac41e8cbc75f8db0bf9e9dec /components/net
parent30525b4f5fe71a18c7d9520b6509fd1dd75464f8 (diff)
downloadservo-1552e1baa27577c0aa9a69545112d281823ebc6f.tar.gz
servo-1552e1baa27577c0aa9a69545112d281823ebc6f.zip
components/net: Fix a double-lock in image_cache
Diffstat (limited to 'components/net')
-rw-r--r--components/net/image_cache.rs42
1 files changed, 27 insertions, 15 deletions
diff --git a/components/net/image_cache.rs b/components/net/image_cache.rs
index 450653b341f..bdc3ef9e83d 100644
--- a/components/net/image_cache.rs
+++ b/components/net/image_cache.rs
@@ -546,13 +546,13 @@ impl ImageCache for ImageCacheImpl {
match cache_result {
ImageCacheResult::Available(ImageOrMetadataAvailable::MetadataAvailable(_)) => {
- let store = self.store.lock().unwrap();
- let id = store
+ let mut store = self.store.lock().unwrap();
+ let id = *store
.pending_loads
.url_to_load_key
.get(&(url, origin, cors_setting))
.unwrap();
- self.add_listener(*id, ImageResponder::new(sender, *id));
+ self.add_listener_with_store(&mut store, id, ImageResponder::new(sender, id));
},
ImageCacheResult::Pending(id) | ImageCacheResult::ReadyForRequest(id) => {
self.add_listener(id, ImageResponder::new(sender, id));
@@ -567,18 +567,7 @@ impl ImageCache for ImageCacheImpl {
/// the responder will still receive the expected response.
fn add_listener(&self, id: PendingImageId, listener: ImageResponder) {
let mut store = self.store.lock().unwrap();
- if let Some(load) = store.pending_loads.get_by_key_mut(&id) {
- if let Some(ref metadata) = load.metadata {
- listener.respond(ImageResponse::MetadataLoaded(metadata.clone()));
- }
- load.add_listener(listener);
- return;
- }
- if let Some(load) = store.completed_loads.values().find(|l| l.id == id) {
- listener.respond(load.image_response.clone());
- return;
- }
- warn!("Couldn't find cached entry for listener {:?}", id);
+ self.add_listener_with_store(&mut store, id, listener);
}
/// Inform the image cache about a response for a pending request.
@@ -661,3 +650,26 @@ impl ImageCache for ImageCacheImpl {
}
}
}
+
+impl ImageCacheImpl {
+ /// Require self.store.lock() before calling.
+ fn add_listener_with_store(
+ &self,
+ store: &mut ImageCacheStore,
+ id: PendingImageId,
+ listener: ImageResponder,
+ ) {
+ if let Some(load) = store.pending_loads.get_by_key_mut(&id) {
+ if let Some(ref metadata) = load.metadata {
+ listener.respond(ImageResponse::MetadataLoaded(metadata.clone()));
+ }
+ load.add_listener(listener);
+ return;
+ }
+ if let Some(load) = store.completed_loads.values().find(|l| l.id == id) {
+ listener.respond(load.image_response.clone());
+ return;
+ }
+ warn!("Couldn't find cached entry for listener {:?}", id);
+ }
+}