mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
components/net: Fix a double-lock in image_cache
This commit is contained in:
parent
30525b4f5f
commit
1552e1baa2
1 changed files with 27 additions and 15 deletions
|
@ -546,13 +546,13 @@ impl ImageCache for ImageCacheImpl {
|
||||||
|
|
||||||
match cache_result {
|
match cache_result {
|
||||||
ImageCacheResult::Available(ImageOrMetadataAvailable::MetadataAvailable(_)) => {
|
ImageCacheResult::Available(ImageOrMetadataAvailable::MetadataAvailable(_)) => {
|
||||||
let store = self.store.lock().unwrap();
|
let mut store = self.store.lock().unwrap();
|
||||||
let id = store
|
let id = *store
|
||||||
.pending_loads
|
.pending_loads
|
||||||
.url_to_load_key
|
.url_to_load_key
|
||||||
.get(&(url, origin, cors_setting))
|
.get(&(url, origin, cors_setting))
|
||||||
.unwrap();
|
.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) => {
|
ImageCacheResult::Pending(id) | ImageCacheResult::ReadyForRequest(id) => {
|
||||||
self.add_listener(id, ImageResponder::new(sender, 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.
|
/// the responder will still receive the expected response.
|
||||||
fn add_listener(&self, id: PendingImageId, listener: ImageResponder) {
|
fn add_listener(&self, id: PendingImageId, listener: ImageResponder) {
|
||||||
let mut store = self.store.lock().unwrap();
|
let mut store = self.store.lock().unwrap();
|
||||||
if let Some(load) = store.pending_loads.get_by_key_mut(&id) {
|
self.add_listener_with_store(&mut store, id, listener);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inform the image cache about a response for a pending request.
|
/// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue