Pixbuf cache: use rwlock where possible.

This commit is contained in:
Jordan Petridis 2018-01-07 07:49:16 +02:00
parent 4a6a9517f1
commit e290ae223e
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6

View File

@ -7,7 +7,7 @@ use hammond_downloader::downloader;
use std::thread; use std::thread;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex, RwLock};
use std::collections::HashMap; use std::collections::HashMap;
use headerbar::Header; use headerbar::Header;
@ -35,8 +35,8 @@ pub fn refresh_feed(headerbar: Arc<Header>, source: Option<Vec<Source>>, sender:
} }
lazy_static! { lazy_static! {
static ref CACHED_PIXBUFS: Mutex<HashMap<(i32, u32), Mutex<SendCell<Pixbuf>>>> = { static ref CACHED_PIXBUFS: RwLock<HashMap<(i32, u32), Mutex<SendCell<Pixbuf>>>> = {
Mutex::new(HashMap::new()) RwLock::new(HashMap::new())
}; };
} }
@ -48,8 +48,8 @@ lazy_static! {
// Also lazy_static requires Sync trait, so that's what the mutexes are. // Also lazy_static requires Sync trait, so that's what the mutexes are.
// TODO: maybe use something that would just scale to requested size? // TODO: maybe use something that would just scale to requested size?
pub fn get_pixbuf_from_path(pd: &PodcastCoverQuery, size: u32) -> Option<Pixbuf> { pub fn get_pixbuf_from_path(pd: &PodcastCoverQuery, size: u32) -> Option<Pixbuf> {
let mut hashmap = CACHED_PIXBUFS.lock().unwrap();
{ {
let hashmap = CACHED_PIXBUFS.read().unwrap();
let res = hashmap.get(&(pd.id(), size)); let res = hashmap.get(&(pd.id(), size));
if let Some(px) = res { if let Some(px) = res {
let m = px.lock().unwrap(); let m = px.lock().unwrap();
@ -60,6 +60,7 @@ pub fn get_pixbuf_from_path(pd: &PodcastCoverQuery, size: u32) -> Option<Pixbuf>
let img_path = downloader::cache_image(pd)?; let img_path = downloader::cache_image(pd)?;
let px = Pixbuf::new_from_file_at_scale(&img_path, size as i32, size as i32, true).ok(); let px = Pixbuf::new_from_file_at_scale(&img_path, size as i32, size as i32, true).ok();
if let Some(px) = px { if let Some(px) = px {
let mut hashmap = CACHED_PIXBUFS.write().unwrap();
hashmap.insert((pd.id(), size), Mutex::new(SendCell::new(px.clone()))); hashmap.insert((pd.id(), size), Mutex::new(SendCell::new(px.clone())));
return Some(px); return Some(px);
} }