Pixbuf cache: use rwlock where possible.
This commit is contained in:
parent
4a6a9517f1
commit
e290ae223e
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user