summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2020-05-25 02:04:23 +0200
committerrabite <rabite@posteo.de>2020-05-25 02:05:39 +0200
commita735747a2792671c0552b52f6739fee378ce7dd3 (patch)
tree95c3aa56e1a100f7c45a8798c84c857d4065f2d6
parent16948dcec4d2060e4c78f589b0a05734daef8b99 (diff)
switch to parking_lot's Mutex/RwLock
-rw-r--r--Cargo.lock40
-rw-r--r--Cargo.toml1
-rw-r--r--src/fail.rs7
-rw-r--r--src/file_browser.rs94
-rw-r--r--src/mediaview.rs92
-rw-r--r--src/preview.rs20
-rw-r--r--src/proclist.rs33
-rw-r--r--src/quick_actions.rs11
-rw-r--r--src/term.rs23
-rw-r--r--src/widget.rs40
10 files changed, 224 insertions, 137 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6bbbaf4..0ea2fba 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -636,6 +636,7 @@ dependencies = [
"nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
"notify 4.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
"osstrtools 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
"parse-ansi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"pathbuftools 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -760,6 +761,14 @@ dependencies = [
]
[[package]]
+name = "lock_api"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "log"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1025,6 +1034,15 @@ dependencies = [
]
[[package]]
+name = "parking_lot"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "parking_lot_core"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1040,6 +1058,19 @@ dependencies = [
]
[[package]]
+name = "parking_lot_core"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "parse-ansi"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1428,6 +1459,11 @@ dependencies = [
]
[[package]]
+name = "smallvec"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "strip-ansi-escapes"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1789,6 +1825,7 @@ dependencies = [
"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff"
+"checksum lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
"checksum lscolors 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea3b3414b2d015c4fd689815f2551797f3c2296bb241dd709c7da233ec7cba4b"
"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
@@ -1820,8 +1857,10 @@ dependencies = [
"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
"checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"
"checksum osstrtools 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7acb1f1b0af8b54107dc46ca4579bae0df3663e8501849201af732c3c0bd0d94"
+"checksum parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e"
"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7"
"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c"
+"checksum parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3"
"checksum parse-ansi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "50c48b4d524f8a10bf6ab37dc0b7583f17c8ec88b617b364ddfc3baee4dcf878"
"checksum pathbuftools 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "00f002a88874c85e30d4e133baae43cf382ceecf025f9493ce23eb381fcc922e"
"checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f"
@@ -1868,6 +1907,7 @@ dependencies = [
"checksum sixel-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fb46e0cd5569bf910390844174a5a99d52dd40681fff92228d221d9f8bf87dea"
"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
+"checksum smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
"checksum strip-ansi-escapes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d63676e2abafa709460982ddc02a3bb586b6d15a49b75c212e06edd3933acee"
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
"checksum strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1c33039533f051704951680f1adfd468fd37ac46816ded0d9ee068e60f05f"
diff --git a/Cargo.toml b/Cargo.toml
index b9a4a64..24a4a9e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -46,6 +46,7 @@ itertools = "0.8"
nix = "0.17"
strip-ansi-escapes = "0.1"
crossbeam = "0.7"
+parking_lot = "0.10"
image = { version = "0.21.1", optional = true }
diff --git a/src/fail.rs b/src/fail.rs
index 519de19..503c766 100644
--- a/src/fail.rs
+++ b/src/fail.rs
@@ -5,9 +5,10 @@ use failure::Fail;
use termion::event::Key;
+use parking_lot::Mutex;
use std::path::PathBuf;
-use std::sync::{Arc, Mutex};
+use std::sync::Arc;
use crate::foldview::LogEntry;
use crate::mediaview::MediaError;
@@ -191,12 +192,12 @@ lazy_static! {
}
pub fn get_logs() -> HResult<Vec<LogEntry>> {
- let logs = LOG.lock()?.drain(..).collect();
+ let logs = LOG.lock().drain(..).collect();
Ok(logs)
}
pub fn put_log<L: Into<LogEntry>>(log: L) -> HResult<()> {
- LOG.lock()?.push(log.into());
+ LOG.lock().push(log.into());
Ok(())
}
diff --git a/src/file_browser.rs b/src/file_browser.rs
index f3cec19..1ff263a 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -1,10 +1,12 @@
use termion::event::Key;
+use parking_lot::{Mutex, RwLock};
+
use pathbuftools::PathBufTools;
use osstrtools::OsStrTools;
use async_value::Stale;
use std::io::Write;
-use std::sync::{Arc, Mutex, RwLock};
+use std::sync::Arc;
use std::path::PathBuf;
use std::ffi::OsString;
use std::os::unix::ffi::OsStringExt;
@@ -193,8 +195,15 @@ impl Tabbable for TabView<FileBrowser> {
dirs
});
- self.active_tab_mut_().fs_cache.watch_only(open_dirs).log();
- self.active_tab_mut_().fs_stat.write()?.refresh().log();
+ self.active_tab_mut_()
+ .fs_cache
+ .watch_only(open_dirs)
+ .log();
+ self.active_tab_mut_()
+ .fs_stat
+ .write()
+ .refresh()
+ .log();
Ok(())
}
@@ -461,7 +470,9 @@ impl FileBrowser {
tab_paths: None
};
- self.proc_view.lock()?.run_proc_raw(cmd)?;
+ self.proc_view
+ .lock()
+ .run_proc_raw(cmd)?;
Ok(())
}
@@ -618,10 +629,15 @@ impl FileBrowser {
None => &self.cwd
}.path.to_string_lossy().to_string();
- self.bookmarks.lock()?.set_coordinates(&self.core.coordinates).log();
+ self.bookmarks
+ .lock()
+ .set_coordinates(&self.core.coordinates)
+ .log();
loop {
- let bookmark = self.bookmarks.lock()?.pick(cwd.to_string());
+ let bookmark = self.bookmarks
+ .lock()
+ .pick(cwd.to_string());
if let Err(HError::TerminalResizedError) = bookmark {
self.core.screen.clear().log();
@@ -633,7 +649,10 @@ impl FileBrowser {
if let Err(HError::WidgetResizedError) = bookmark {
let coords = &self.core.coordinates;
- self.bookmarks.lock()?.set_coordinates(&coords).log();
+ self.bookmarks
+ .lock()
+ .set_coordinates(&coords)
+ .log();
self.core.screen.clear().log();
self.refresh().log();
self.draw().log();
@@ -660,8 +679,14 @@ impl FileBrowser {
pub fn add_bookmark(&mut self) -> HResult<()> {
let cwd = self.cwd.path.to_string_lossy().to_string();
let coords = &self.core.coordinates;
- self.bookmarks.lock()?.set_coordinates(&coords).log();
- self.bookmarks.lock()?.add(&cwd)?;
+
+ self.bookmarks
+ .lock()
+ .set_coordinates(&coords)
+ .log();
+ self.bookmarks
+ .lock()
+ .add(&cwd)?;
Ok(())
}
@@ -1074,10 +1099,11 @@ impl FileBrowser {
fn external_select(&mut self) -> HResult<()> {
let shell = std::env::var("SHELL").unwrap_or("bash".into());
let cmd = self.core
- .config.read()?
- .get()?
- .select_cmd
- .clone();
+ .config
+ .read()
+ .get()?
+ .select_cmd
+ .clone();
self.core.get_sender().send(Events::InputEnabled(false))?;
self.core.screen.suspend().log();
@@ -1182,10 +1208,11 @@ impl FileBrowser {
fn external_cd(&mut self) -> HResult<()> {
let shell = std::env::var("SHELL").unwrap_or("bash".into());
let cmd = self.core
- .config.read()?
- .get()?
- .cd_cmd
- .clone();
+ .config
+ .read()
+ .get()?
+ .cd_cmd
+ .clone();
self.core.get_sender().send(Events::InputEnabled(false))?;
self.core.screen.suspend().log();
@@ -1272,7 +1299,9 @@ impl FileBrowser {
tab_paths: Some(tab_dirs)
};
- self.proc_view.lock()?.run_proc_subshell(cmd)?;
+ self.proc_view
+ .lock()
+ .run_proc_subshell(cmd)?;
Ok(())
}
@@ -1309,7 +1338,7 @@ impl FileBrowser {
self.preview_widget().map(|preview| preview.cancel_animation()).log();
let procview = self.proc_view.clone();
loop {
- match procview.lock()?.popup() {
+ match procview.lock().popup() {
// Ignore refresh
Err(HError::RefreshParent) => continue,
Err(HError::TerminalResizedError) |
@@ -1323,7 +1352,9 @@ impl FileBrowser {
pub fn show_log(&mut self) -> HResult<()> {
self.preview_widget().map(|preview| preview.cancel_animation()).log();
loop {
- let res = self.log_view.lock()?.popup();
+ let res = self.log_view
+ .lock()
+ .popup();
if let Err(HError::RefreshParent) = res {
continue
@@ -1382,7 +1413,10 @@ impl FileBrowser {
let count_xpos = xsize - file_count.len() as u16;
let count_ypos = ypos + self.get_coordinates()?.ysize();
- let fs = self.fs_stat.read()?.find_fs(&file.path)?.clone();
+ let fs = self.fs_stat
+ .read()
+ .find_fs(&file.path)?
+ .clone();
let dev = fs.get_dev().unwrap_or(String::from(""));
let free_space = fs.get_free();
@@ -1429,9 +1463,19 @@ impl Widget for FileBrowser {
fn set_coordinates(&mut self, coordinates: &Coordinates) -> HResult<()> {
self.core.coordinates = coordinates.clone();
self.columns.set_coordinates(&coordinates).log();
- self.proc_view.lock()?.set_coordinates(&coordinates).log();
- self.log_view.lock()?.set_coordinates(&coordinates).log();
- self.bookmarks.lock()?.set_coordinates(&coordinates).log();
+
+ self.proc_view
+ .lock()
+ .set_coordinates(&coordinates)
+ .log();
+ self.log_view
+ .lock()
+ .set_coordinates(&coordinates)
+ .log();
+ self.bookmarks
+ .lock()
+ .set_coordinates(&coordinates)
+ .log();
Ok(())
}
@@ -1468,7 +1512,7 @@ impl Widget for FileBrowser {
let xsize = term::xsize_u();
let mut status = self.get_core()?
.status_bar_content
- .lock()?;
+ .lock();
let status = status.as_mut()
.take();
let active = self.columns
diff --git a/src/mediaview.rs b/src/mediaview.rs
index e1dd7de..682cfa5 100644
--- a/src/mediaview.rs
+++ b/src/mediaview.rs
@@ -1,6 +1,7 @@
use lazy_static;
use termion::event::Key;
use failure::{self, Fail};
+use parking_lot::{Mutex, RwLock};
use crate::widget::{Widget, WidgetCore};
use crate::coordinates::Coordinates;
@@ -9,7 +10,7 @@ use crate::fail::{HResult, HError, ErrorLog, ErrorCause};
use crate::imgview::ImgView;
use std::path::{Path, PathBuf};
-use std::sync::{Arc, Mutex, RwLock,
+use std::sync::{Arc,
mpsc::{channel, Sender}};
use std::io::{BufRead, BufReader, Write};
@@ -120,7 +121,7 @@ impl MediaView {
// Use current size. Widget could have been resized at some point
let (xsize, ysize, xpix, ypix) =
{
- let view = thread_imgview.lock()?;
+ let view = thread_imgview.lock();
let (xsize, ysize) = view.core.coordinates.size_u();
let (xpix, ypix) = view.core.coordinates.size_pixels()?;
(xsize, ysize, xpix, ypix)
@@ -159,7 +160,7 @@ impl MediaView {
let mut stdout = BufReader::new(previewer.stdout.take()?);
let mut stdin = previewer.stdin.take()?;
- cprocess.lock().map(|mut p| *p = Some(previewer))?;
+ *cprocess.lock() = Some(previewer);
let mut frame = vec![];
let newline = String::from("\n");
@@ -167,7 +168,7 @@ impl MediaView {
let rx_cmd = rx_cmd.clone();
std::thread::spawn(move || -> HResult<()> {
- for cmd in rx_cmd.lock()?.iter() {
+ for cmd in rx_cmd.lock().iter() {
write!(stdin, "{}", cmd)?;
write!(stdin, "\n")?;
stdin.flush()?;
@@ -177,9 +178,10 @@ impl MediaView {
loop {
// Check if preview-gen finished and break out of loop to restart
- if let Ok(Some(code)) = cprocess.lock()?
- .as_mut()?
- .try_wait() {
+ if let Ok(Some(code)) = cprocess.lock()
+ .as_mut()?
+ .try_wait()
+ {
if code.success() {
break;
} else {
@@ -200,7 +202,7 @@ impl MediaView {
stdout.read_line(&mut line_buf)?;
let h = line_buf.trim().parse::<usize>()?;
- let mut height = height.lock().unwrap();
+ let mut height = height.lock();
if *height != h {
new_height = true;
} else {
@@ -212,26 +214,25 @@ impl MediaView {
line_buf.clear();
stdout.read_line(&mut line_buf)?;
let pos = &line_buf.trim();
- *position.lock().unwrap() = pos
+ *position.lock() = pos
.parse::<usize>()?;
line_buf.clear();
stdout.read_line(&mut line_buf)?;
let dur = &line_buf.trim();
- *duration.lock().unwrap() = dur
+ *duration.lock() = dur
.parse::<usize>()?;
- if let Ok(mut imgview) = thread_imgview.lock() {
- if new_height {
- imgview.core.clear()?;
- }
- imgview.set_image_data(frame);
- sender.send(crate::widget::Events::WidgetReady)
- .map_err(|e| HError::from(e))
- .log();
+ let mut imgview = thread_imgview.lock();
+ if new_height {
+ imgview.core.clear()?;
}
+ imgview.set_image_data(frame);
+ sender.send(crate::widget::Events::WidgetReady)
+ .map_err(|e| HError::from(e))
+ .log();
line_buf.clear();
frame = vec![];
@@ -304,8 +305,8 @@ impl MediaView {
pub fn progress_bar(&self) -> HResult<String> {
let xsize = self.core.coordinates.xsize_u();
- let position = self.position.lock()?.clone();
- let duration = self.duration.lock()?.clone();
+ let position = self.position.lock().clone();
+ let duration = self.duration.lock().clone();
if duration == 0 || position == 0 {
Ok(format!("{:elements$}", "|", elements=xsize))
@@ -323,8 +324,8 @@ impl MediaView {
}
pub fn progress_string(&self) -> HResult<String> {
- let position = self.position.lock()?.clone();
- let duration = self.duration.lock()?.clone();
+ let position = self.position.lock().clone();
+ let duration = self.duration.lock().clone();
let fposition = self.format_secs(position);
let fduration = self.format_secs(duration);
@@ -342,7 +343,7 @@ impl MediaView {
let mut icons = String::new();
- if *MUTE.read()? == true {
+ if *MUTE.read() == true {
icons += &crate::term::goto_xy_u(xpos+xsize-2, ypos+lines);
icons += mute_char;
} else {
@@ -351,7 +352,7 @@ impl MediaView {
icons += " ";
}
- if *AUTOPLAY.read()? == true {
+ if *AUTOPLAY.read() == true {
icons += &crate::term::goto_xy_u(xpos+xsize-4, ypos+lines);
icons += play_char;
} else {
@@ -371,8 +372,8 @@ impl MediaView {
}
pub fn toggle_pause(&mut self) -> HResult<()> {
- let auto = AUTOPLAY.read()?.clone();
- let pos = self.position.lock()?.clone();
+ let auto = AUTOPLAY.read().clone();
+ let pos = self.position.lock().clone();
// This combination means only first frame was shown, since
// self.paused will be false, even with autoplay off
@@ -410,40 +411,31 @@ impl MediaView {
}
pub fn autoplay(&self) -> bool {
- if let Ok(autoplay) = AUTOPLAY.read() {
- return *autoplay;
- }
- return true;
+ *AUTOPLAY.read()
}
pub fn mute(&self) -> bool {
- if let Ok(mute) = MUTE.read() {
- return *mute;
- }
- return false;
+ *MUTE.read()
}
pub fn toggle_autoplay(&self) {
- if let Ok(mut autoplay) = AUTOPLAY.write() {
- *autoplay = !*autoplay;
- }
+ *AUTOPLAY.write() = !*AUTOPLAY.read();
}
pub fn toggle_mute(&self) {
- if let Ok(mut mute) = MUTE.write() {
- *mute = !*mute;
- if *mute {
- self.controller.send(String::from("m")).ok();
- } else {
- self.controller.send(String::from("u")).ok();
- }
+ let mut mute = MUTE.write();
+ *mute = !*mute;
+ if *mute {
+ self.controller.send(String::from("m")).ok();
+ } else {
+ self.controller.send(String::from("u")).ok();
}
}
pub fn kill(&mut self) -> HResult<()> {
let proc = self.process.clone();
std::thread::spawn(move || -> HResult<()> {
- proc.lock()?
+ proc.lock()
.as_mut()
.map(|p| {
p.kill().map_err(|e| HError::from(e)).log();
@@ -470,7 +462,7 @@ impl Widget for MediaView {
self.core.coordinates = coordinates.clone();
- let mut imgview = self.imgview.lock()?;
+ let mut imgview = self.imgview.lock();
imgview.set_image_data(vec![]);
imgview.set_coordinates(&coordinates)?;
@@ -497,13 +489,13 @@ impl Widget for MediaView {
fn get_drawlist(&self) -> HResult<String> {
let (xpos, ypos) = self.core.coordinates.position_u();
- let height = *self.height.lock()?;
+ let height = *self.height.lock();
let progress_str = self.progress_string()?;
let progress_bar = self.progress_bar()?;
- let frame= self.imgview
- .lock()
- .map(|img| img.get_drawlist())?;
+ let frame = self.imgview
+ .lock()
+ .get_drawlist();
let mut frame = frame?;
diff --git a/src/preview.rs b/src/preview.rs
index 382fdf2..f9b3c56 100644
--- a/src/preview.rs
+++ b/src/preview.rs
@@ -1,7 +1,9 @@
use async_value::{Async, Stale};
use termion::event::Key;
+use parking_lot::Mutex;
-use std::sync::{Arc, Mutex};
+
+use std::sync::Arc;
use std::path::PathBuf;
use crate::files::{File, Files, Kind, Ticker};
@@ -26,7 +28,7 @@ fn kill_proc() -> HResult<()> {
// Kill media previewer if it still runs
ImgView::kill_running();
- let mut pid = SUBPROC.lock()?;
+ let mut pid = SUBPROC.lock();
pid.map(|pid|
// Do this in another thread so we can wait on process to exit with SIGHUP
std::thread::spawn(move || {
@@ -75,7 +77,10 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
closure(stale).map_err(|e| e.into()));
widget.on_ready(move |_, stale| {
if !stale.is_stale()? {
- sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok();
+ sender.lock()
+ .send(crate::widget::Events::WidgetReady)
+ .map_err(HError::from)
+ .log();
}
Ok(())
}).log();
@@ -104,8 +109,9 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
widget.on_ready(move |_, stale| {
if !stale.is_stale()? {
sender.lock()
- .map(|s| s.send(crate::widget::Events::WidgetReady))
- .ok();
+ .send(crate::widget::Events::WidgetReady)
+ .map_err(HError::from)
+ .log();
}
Ok(())
}).log();
@@ -539,7 +545,7 @@ impl Previewer {
let pid = process.id();
{
- let mut pid_ = SUBPROC.lock()?;
+ let mut pid_ = SUBPROC.lock();
*pid_ = Some(pid);
}
@@ -548,7 +554,7 @@ impl Previewer {
if stale.is_stale()? { return Previewer::preview_failed(&file) }
{
- let mut pid_ = SUBPROC.lock()?;
+ let mut pid_ = SUBPROC.lock();
*pid_ = None;
}
diff --git a/src/proclist.rs b/src/proclist.rs
index 36c724e..f82ffbb 100644
--- a/src/proclist.rs
+++ b/src/proclist.rs
@@ -1,4 +1,4 @@
-use std::sync::{Arc, Mutex};
+use std::sync::Arc;
use std::sync::mpsc::Sender;
use std::process::{Child, Command};
use std::os::unix::process::{CommandExt, ExitStatusExt};
@@ -10,6 +10,7 @@ use termion::event::Key;
use unicode_width::UnicodeWidthStr;
use osstrtools::{OsStringTools, OsStrTools, OsStrConcat};
use async_value::Stale;
+use parking_lot::Mutex;
use crate::listview::{Listable, ListView};
use crate::textview::TextView;
@@ -133,10 +134,10 @@ impl Process {
let success = self.success.clone();
let sender = self.sender.clone();
let cmd = self.cmd.clone();
- let pid = self.handle.lock()?.id();
+ let pid = self.handle.lock().id();
std::thread::spawn(move || -> HResult<()> {
- let stdout = handle.lock()?.stdout.take()?;
+ let stdout = handle.lock().stdout.take()?;
let mut stdout = BufReader::new(stdout);
let mut processor = move |cmd, sender: &Sender<Events>| -> HResult<()> {
loop {
@@ -146,7 +147,7 @@ impl Process {
if len == 0 { return Ok(()) }
- output.lock()?.push_str(&buffer);
+ output.lock().push_str(&buffer);
let status = format!("{}: read {} chars!", cmd, len);
sender.send(Events::Status(status))?;
@@ -159,15 +160,15 @@ impl Process {
};
processor(&cmd, &sender).log();
- if let Ok(proc_status) = handle.lock()?.wait() {
+ if let Ok(proc_status) = handle.lock().wait() {
let proc_success = proc_status.success();
let proc_status = match proc_status.code() {
Some(status) => status,
None => proc_status.signal().unwrap_or(-1)
};
- *success.lock()? = Some(proc_success);
- *status.lock()? = Some(proc_status);
+ *success.lock() = Some(proc_success);
+ *status.lock() = Some(proc_status);
let color_success =
if proc_success {
@@ -363,7 +364,7 @@ impl ListView<Vec<Process>> {
fn kill_proc(&mut self) -> HResult<()> {
let proc = self.selected_proc()?;
- proc.handle.lock()?.kill()?;
+ proc.handle.lock().kill()?;
Ok(())
}
@@ -380,8 +381,8 @@ impl ListView<Vec<Process>> {
}
pub fn render_proc(&self, proc: &Process) -> HResult<String> {
- let pid = proc.handle.lock()?.id();
- let status = match *proc.status.lock()? {
+ let pid = proc.handle.lock().id();
+ let status = match *proc.status.lock() {
Some(status) => format!("{}", status),
None => format!("<{}>", pid),
};
@@ -392,7 +393,7 @@ impl ListView<Vec<Process>> {
let padding = sized_string.len() - sized_string.width_cjk();
let padding = xsize - padding as u16;
- let color_status = match *proc.success.lock().unwrap() {
+ let color_status = match *proc.success.lock() {
Some(false) => { format!("{}{}", term::color_red(), status) }
_ => { status }
};
@@ -530,7 +531,7 @@ impl ProcView {
if Some(self.get_listview_mut().get_selection()) == self.viewing {
return Ok(());
}
- let output = self.get_listview_mut().selected_proc()?.output.lock()?.clone();
+ let output = self.get_listview_mut().selected_proc()?.output.lock().clone();
let animator = self.animator.clone();
animator.set_fresh().log();
@@ -601,7 +602,7 @@ impl Widget for ProcView {
let procs_running = listview
.content
.iter()
- .filter(|proc| proc.status.lock().unwrap().is_none())
+ .filter(|proc| proc.status.lock().is_none())
.count();
let header = format!("Running processes: {} / {}",
@@ -617,9 +618,9 @@ impl Widget for ProcView {
if let Some(proc) = listview.content.get(selection) {
let cmd = &proc.cmd;
- let pid = proc.handle.lock()?.id();
- let proc_status = proc.status.lock()?;
- let proc_success = proc.success.lock()?;
+ let pid = proc.handle.lock().id();
+ let proc_status = proc.status.lock();
+ let proc_success = proc.success.lock();
let procinfo = if proc_status.is_some() {
let color_success =
diff --git a/src/quick_actions.rs b/src/quick_actions.rs
index 74ff9db..2257b86 100644
--- a/src/quick_actions.rs
+++ b/src/quick_actions.rs
@@ -1,13 +1,12 @@
use mime_guess::Mime;
use termion::event::Key;
+use parking_lot::Mutex;
use async_value::Async;
use std::path::PathBuf;
-use std::sync::{
- Arc, Mutex,
- mpsc::Sender,
-};
+use std::sync::{Arc,
+ mpsc::Sender};
use std::ffi::OsString;
use std::str::FromStr;
@@ -420,9 +419,7 @@ impl QuickAction {
proc_view
.lock()
- .map(|mut proc_view| {
- proc_view.run_proc_raw(cmd)
- })??;
+ .run_proc_raw(cmd)?;
Ok(())
}
diff --git a/src/term.rs b/src/term.rs
index 1dd4a7b..2ae0b6a 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -1,5 +1,5 @@
use std::io::{Stdout, Write, BufWriter, BufRead};
-use std::sync::{Arc, Mutex, RwLock};
+use std::sync::Arc;
use termion;
use termion::screen::AlternateScreen;
@@ -7,6 +7,7 @@ use termion::raw::{IntoRawMode, RawTerminal};
use parse_ansi::parse_bytes;
use crate::unicode_width::{UnicodeWidthStr, UnicodeWidthChar};
+use parking_lot::{Mutex, RwLock};
use crate::fail::{HResult, ErrorLog};
use crate::trait_ext::ExtractResult;
@@ -35,23 +36,23 @@ impl Screen {
}
pub fn set_size(&self, size: (usize, usize)) -> HResult<()> {
- *self.size.write()? = Some(size);
+ *self.size.write() = Some(size);
Ok(())
}
pub fn is_resized(&self) -> HResult<bool> {
- Ok(self.size.read()?.is_some())
+ Ok(self.size.read().is_some())
}
pub fn get_size(&self) -> HResult<(usize, usize)> {
- match self.size.read()?.clone() {
+ match self.size.read().clone() {
Some((xsize, ysize)) => Ok((xsize, ysize)),
None => Ok((self.xsize()?, self.ysize()?))
}
}
pub fn take_size(&self) -> HResult<(usize, usize)> {
- Ok(self.size.write()?.take()?)
+ Ok(self.size.write().take()?)
}
pub fn set_title(&mut self, title: &str) -> HResult<()> {
@@ -71,16 +72,12 @@ impl Write for Screen {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.screen
.lock()
- .map_err(|_| std::io::Error::new(std::io::ErrorKind::Other,
- "Screen Mutex poisoned!"))
- .and_then(|mut s| s.write(buf))
+ .write(buf)
}
fn flush(&mut self) -> std::io::Result<()> {
self.screen
.lock()
- .map_err(|_| std::io::Error::new(std::io::ErrorKind::Other,
- "Screen Mutex poisoned!"))
- .and_then(|mut s| s.flush())
+ .flush()
}
}
@@ -155,13 +152,13 @@ pub trait ScreenExt: Write {
impl ScreenExt for Screen {
fn suspend_raw_mode(&mut self) -> HResult<()> {
self.screen
- .lock()?
+ .lock()
.suspend_raw_mode()
}
fn activate_raw_mode(&mut self) -> HResult<()> {
self.screen
- .lock()?
+ .lock()
.activate_raw_mode()
}
}
diff --git a/src/widget.rs b/src/widget.rs
index 1d27dbe..904e3e8 100644
--- a/src/widget.rs
+++ b/src/widget.rs
@@ -1,10 +1,11 @@
-use std::sync::{Arc, Mutex, RwLock};
+use std::sync::Arc;
use std::sync::mpsc::{Sender, Receiver, channel};
use std::io::{Write, stdin};
use termion::event::{Event, Key, MouseEvent};
use termion::input::TermRead;
use async_value::{Async, Stale};
+use parking_lot::{Mutex, RwLock};
use crate::coordinates::{Coordinates, Position, Size};
@@ -91,17 +92,17 @@ impl WidgetCore {
config: Arc::new(RwLock::new(config)) };
let minibuffer = MiniBuffer::new(&core);
- *core.minibuffer.lock().unwrap() = Some(minibuffer);
+ *core.minibuffer.lock() = Some(minibuffer);
Ok(core)
}
pub fn get_sender(&self) -> Sender<Events> {
- self.event_sender.lock().unwrap().clone()
+ self.event_sender.lock().clone()
}
pub fn draw_status(&self) -> HResult<()> {
let xsize = term::xsize_u();
- let status = match self.status_bar_content.lock()?.as_ref() {
+