wrap queue in arc<mutex<>> as it needs to mutable across threads

This commit is contained in:
Henrik Friedrichsen
2019-02-10 21:00:12 +01:00
parent 0b26c5411c
commit f75c6fbbb8
2 changed files with 9 additions and 10 deletions

View File

@@ -21,8 +21,7 @@ use std::io::prelude::*;
use std::path::PathBuf; use std::path::PathBuf;
use std::process; use std::process;
use std::sync::Arc; use std::sync::Arc;
use std::rc::Rc; use std::sync::Mutex;
use std::cell::RefCell;
use cursive::views::*; use cursive::views::*;
use cursive::Cursive; use cursive::Cursive;
@@ -79,7 +78,7 @@ fn main() {
}; };
let cfg = config::load(path.to_str().unwrap()).expect("could not load configuration file"); let cfg = config::load(path.to_str().unwrap()).expect("could not load configuration file");
let queue = Rc::new(RefCell::new(queue::Queue::new())); let queue = Arc::new(Mutex::new(queue::Queue::new()));
let spotify = Arc::new(spotify::Spotify::new( let spotify = Arc::new(spotify::Spotify::new(
cfg.username, cfg.username,

View File

@@ -4,8 +4,7 @@ use cursive::traits::Identifiable;
use cursive::views::*; use cursive::views::*;
use cursive::Cursive; use cursive::Cursive;
use std::sync::Arc; use std::sync::Arc;
use std::rc::Rc; use std::sync::Mutex;
use std::cell::RefCell;
use librespot::core::spotify_id::SpotifyId; use librespot::core::spotify_id::SpotifyId;
@@ -14,11 +13,11 @@ use queue::Queue;
pub struct SearchView { pub struct SearchView {
pub view: Panel<LinearLayout>, pub view: Panel<LinearLayout>,
queue: Rc<RefCell<Queue>>, queue: Arc<Mutex<Queue>>,
} }
impl SearchView { impl SearchView {
fn search_handler(s: &mut Cursive, input: &str, spotify: Arc<Spotify>, queue: Rc<RefCell<Queue>>) { fn search_handler(s: &mut Cursive, input: &str, spotify: Arc<Spotify>, queue: Arc<Mutex<Queue>>) {
let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap(); let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap();
let tracks = spotify.search(input, 50, 0); let tracks = spotify.search(input, 50, 0);
@@ -37,10 +36,11 @@ impl SearchView {
s.load(trackid); s.load(trackid);
s.play(); s.play();
}); });
let p = queue.clone(); let queue = queue.clone();
let button_queue = OnEventView::new(button) let button_queue = OnEventView::new(button)
.on_event(' ', move |_cursive| { .on_event(' ', move |_cursive| {
p.borrow_mut().enqueue(track.clone()); let mut queue = queue.lock().unwrap();
queue.enqueue(track.clone());
debug!("Added to queue: {}", track.name); debug!("Added to queue: {}", track.name);
}); });
results.add_child("", button_queue); results.add_child("", button_queue);
@@ -48,7 +48,7 @@ impl SearchView {
} }
} }
pub fn new(spotify: Arc<Spotify>, queue: Rc<RefCell<Queue>>) -> SearchView { pub fn new(spotify: Arc<Spotify>, queue: Arc<Mutex<Queue>>) -> SearchView {
let spotify_ref = spotify.clone(); let spotify_ref = spotify.clone();
let queue_ref = queue.clone(); let queue_ref = queue.clone();
let searchfield = EditView::new() let searchfield = EditView::new()