diff options
author | BurtonQin <bobbqqin@gmail.com> | 2022-10-05 12:52:16 -0400 |
---|---|---|
committer | BurtonQin <bobbqqin@gmail.com> | 2022-10-10 05:36:36 +0000 |
commit | 1552e1baa27577c0aa9a69545112d281823ebc6f (patch) | |
tree | 50b4ea7e234c4fefac41e8cbc75f8db0bf9e9dec /components/net | |
parent | 30525b4f5fe71a18c7d9520b6509fd1dd75464f8 (diff) | |
download | servo-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.rs | 42 |
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); + } +} |