EpisodeWidget: Remove unnecessary Arcs.

`DateMachine` and `DurationMachine` are only mutated during initialization
and thus do not need shared ownership.
`TitleMachine` is only mutated during initialization and after that only
the callback will keep holding a referrence to it. The `EpisodeWidget`s
get dropped after initialization. So it's justifiable to use `Rc<Mutex<T>>`
instead of `Arc`.
This commit is contained in:
Jordan Petridis 2018-03-13 03:47:46 +02:00
parent 05628a2529
commit 74712b5410
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6

View File

@ -17,15 +17,16 @@ use widgets::episode_states::*;
use std::ops::DerefMut; use std::ops::DerefMut;
use std::path::Path; use std::path::Path;
use std::rc::Rc;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct EpisodeWidget { pub struct EpisodeWidget {
pub container: gtk::Box, pub container: gtk::Box,
date: Arc<Mutex<DateMachine>>, date: Mutex<DateMachine>,
title: Arc<Mutex<TitleMachine>>, duration: Mutex<DurationMachine>,
duration: Arc<Mutex<DurationMachine>>, title: Rc<Mutex<TitleMachine>>,
media: Arc<Mutex<MediaMachine>>, media: Arc<Mutex<MediaMachine>>,
} }
@ -50,11 +51,10 @@ impl Default for EpisodeWidget {
let separator2: gtk::Label = builder.get_object("separator2").unwrap(); let separator2: gtk::Label = builder.get_object("separator2").unwrap();
let prog_separator: gtk::Label = builder.get_object("prog_separator").unwrap(); let prog_separator: gtk::Label = builder.get_object("prog_separator").unwrap();
let title_machine = Arc::new(Mutex::new(TitleMachine::new(title, false))); let date_machine = Mutex::new(DateMachine::new(date, 0));
let date_machine = Arc::new(Mutex::new(DateMachine::new(date, 0))); let dur_machine = Mutex::new(DurationMachine::new(duration, separator1, None));
let dur = DurationMachine::new(duration, separator1, None); let title_machine = Rc::new(Mutex::new(TitleMachine::new(title, false)));
let duration_machine = Arc::new(Mutex::new(dur)); let media = MediaMachine::new(
let _media = MediaMachine::new(
play, play,
download, download,
progress, progress,
@ -64,12 +64,12 @@ impl Default for EpisodeWidget {
separator2, separator2,
prog_separator, prog_separator,
); );
let media_machine = Arc::new(Mutex::new(_media)); let media_machine = Arc::new(Mutex::new(media));
EpisodeWidget { EpisodeWidget {
container, container,
title: title_machine, title: title_machine,
duration: duration_machine, duration: dur_machine,
date: date_machine, date: date_machine,
media: media_machine, media: media_machine,
} }
@ -222,7 +222,7 @@ fn on_download_clicked(ep: &EpisodeWidgetQuery, sender: Sender<Action>) -> Resul
#[inline] #[inline]
fn on_play_bttn_clicked( fn on_play_bttn_clicked(
episode: &mut EpisodeWidgetQuery, episode: &mut EpisodeWidgetQuery,
title: Arc<Mutex<TitleMachine>>, title: Rc<Mutex<TitleMachine>>,
sender: Sender<Action>, sender: Sender<Action>,
) -> Result<(), Error> { ) -> Result<(), Error> {
open_uri(episode.rowid())?; open_uri(episode.rowid())?;