From 8a00e4588ce1ba008426b3096452e63557e1e9a4 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Fri, 9 Apr 2021 13:01:47 +0200 Subject: [PATCH] import: Don't deadlock state receiver --- import/src/disc.rs | 3 +-- import/src/folder.rs | 3 +-- import/src/session.rs | 9 +++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/import/src/disc.rs b/import/src/disc.rs index 2d2c27b..2b8f697 100644 --- a/import/src/disc.rs +++ b/import/src/disc.rs @@ -6,7 +6,6 @@ use gstreamer::tags::{Duration, TrackNumber}; use log::info; use sha2::{Sha256, Digest}; use std::path::PathBuf; -use std::sync::Mutex; use tokio::sync::watch; /// Create a new import session for the default disc drive. @@ -150,7 +149,7 @@ pub(super) fn new() -> Result { tracks, copy: Some(Box::new(copy)), state_sender, - state_receiver: Mutex::new(state_receiver), + state_receiver, }; Ok(session) diff --git a/import/src/folder.rs b/import/src/folder.rs index d620152..a072cbc 100644 --- a/import/src/folder.rs +++ b/import/src/folder.rs @@ -6,7 +6,6 @@ use log::{warn, info}; use sha2::{Sha256, Digest}; use std::fs::DirEntry; use std::path::PathBuf; -use std::sync::Mutex; use tokio::sync::watch; /// Create a new import session for the specified folder. @@ -65,7 +64,7 @@ pub(super) fn new(path: PathBuf) -> Result { tracks, copy: None, state_sender, - state_receiver: Mutex::new(state_receiver), + state_receiver, }; Ok(session) diff --git a/import/src/session.rs b/import/src/session.rs index d556a49..fd9e226 100644 --- a/import/src/session.rs +++ b/import/src/session.rs @@ -2,7 +2,7 @@ use crate::{disc, folder}; use crate::error::Result; use std::path::PathBuf; use std::thread; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use tokio::sync::{oneshot, watch}; /// The current state of the import process. @@ -36,7 +36,7 @@ pub struct ImportSession { pub(super) state_sender: watch::Sender, /// Receiver for state changes. - pub(super) state_receiver: Mutex>, + pub(super) state_receiver: watch::Receiver, } impl ImportSession { @@ -76,12 +76,13 @@ impl ImportSession { /// Retrieve the current state of the import process. pub fn state(&self) -> State { - self.state_receiver.lock().unwrap().borrow().clone() + self.state_receiver.borrow().clone() } /// Wait for the next state change and get the new state. pub async fn state_change(&self) -> State { - match self.state_receiver.lock().unwrap().changed().await { + let mut receiver = self.state_receiver.clone(); + match receiver.changed().await { Ok(()) => self.state(), Err(_) => State::Error, }