From 667ee440e0f8084fc86bc67ea3ee98e8591b59ba Mon Sep 17 00:00:00 2001 From: Lynnesbian Date: Tue, 23 Nov 2021 08:38:43 +1000 Subject: [PATCH] use parking_lot's rwlock, cargo update --- .idea/fif.iml | 26 ++++++++++++++++++++++- CHANGELOG.md | 5 +++++ Cargo.lock | 58 +++++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 1 + src/files.rs | 18 +++++----------- src/main.rs | 6 ++++-- 6 files changed, 94 insertions(+), 20 deletions(-) diff --git a/.idea/fif.iml b/.idea/fif.iml index f58169f..b079a63 100644 --- a/.idea/fif.iml +++ b/.idea/fif.iml @@ -5,6 +5,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -16,4 +40,4 @@ - + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 258c3d1..456e847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Dates are given in YYYY-MM-DD format - for example, the 15th of October 2021 is The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased +### Other +- Use [`parking_lot`]'s `RwLock` instead of the built-in one for a slight performance increase + ## v0.4.0 - 2021-10-14 ### Added - `--fix` mode - instead of outputting a shell script or text file, fif will rename the misnamed files for you! @@ -278,6 +282,7 @@ Initial commit! [`mime_guess`]: https://crates.io/crates/mime_guess [`new_mime_guess`]: https://crates.io/crates/new_mime_guess [`once_cell`]: https://crates.io/crates/once_cell +[`parking_lot`]: https://crates.io/crates/parking_lot [`snailquote`]: https://crates.io/crates/snailquote [`structopt`]: https://crates.io/crates/structopt [`xdg-mime`]: https://crates.io/crates/xdg-mime diff --git a/Cargo.lock b/Cargo.lock index 9d32fa2..e773e72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,6 +190,7 @@ dependencies = [ "new_mime_guess", "num_cpus", "once_cell", + "parking_lot", "rand", "rayon", "serde", @@ -261,6 +262,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "itertools" version = "0.10.1" @@ -297,9 +307,18 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a60553f9a9e039a333b4e9b20573b9e9b9c0bb3a11e201ccc48ef4283456d673" +checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] [[package]] name = "log" @@ -383,6 +402,31 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + [[package]] name = "phf" version = "0.10.0" @@ -606,9 +650,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.68" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +checksum = "063bf466a64011ac24040a49009724ee60a57da1b437617ceb32e53ad61bfb19" dependencies = [ "itoa", "ryu", @@ -621,6 +665,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" +[[package]] +name = "smallvec" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" + [[package]] name = "smartstring" version = "0.2.9" diff --git a/Cargo.toml b/Cargo.toml index a8b8cc8..09df6ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ serde = { version = "1.0", features = ["derive"], optional = true } serde_json = { version = "1.0", optional = true } num_cpus = { version = "1.13.0", optional = true } maplit = "1.0.2" +parking_lot = "0.11.2" [target.'cfg(not(unix))'.dependencies] xdg-mime = { version = "0.3.3", optional = true } diff --git a/src/files.rs b/src/files.rs index c603133..fa7df63 100644 --- a/src/files.rs +++ b/src/files.rs @@ -8,7 +8,6 @@ use std::fs::File; use std::io::{self, Read, Seek, SeekFrom}; use std::path::Path; use std::str::FromStr; -use std::sync::RwLock; use cfg_if::cfg_if; use itertools::{Either, Itertools}; @@ -16,6 +15,7 @@ use log::{debug, error}; use mime::Mime; use mime_guess::from_ext; use once_cell::sync::Lazy; +use parking_lot::RwLock; use walkdir::{DirEntry, WalkDir}; use crate::findings::{Findings, ScanError}; @@ -300,10 +300,8 @@ pub fn mime_type(db: &T, path: &Path) -> io::Result> { /// ignores the type suffix, treating "image/svg+xml" as "image/svg", and thus fails to find any extensions. Passing the /// `essence_str` (which includes the suffix) fixes this. pub fn mime_extension_lookup(essence: String) -> Option> { - if let Ok(cache) = MIMEXT.read() { - if let Some(exts) = cache.get(&essence) { - return exts.clone(); - } + if let Some(exts) = MIMEXT.read().get(&essence) { + return exts.clone(); } let mut exts = mime_guess::get_mime_extensions_str(essence.as_str()); @@ -364,12 +362,6 @@ pub fn mime_extension_lookup(essence: String) -> Option> { None => None, }; - if let Ok(mut cache) = MIMEXT.write() { - cache.insert(essence, exts.clone()); - exts - } else { - // this should only ever happen if cache.insert() hangs on another thread; i.e., close enough to "never" that - // marking this as unreachable should be fine - unreachable!() - } + MIMEXT.write().insert(essence, exts.clone()); + exts } diff --git a/src/main.rs b/src/main.rs index 7e7fdb2..f776e72 100644 --- a/src/main.rs +++ b/src/main.rs @@ -222,11 +222,13 @@ fn main() { #[cfg(feature = "json")] OutputFormat::Json => formats::Json.write_all(&mut buffered_stdout, &findings, &errors), OutputFormat::Text => formats::Text.write_all(&mut buffered_stdout, &findings, &errors), - }.is_err() { + } + .is_err() + { error!("Failed to write to stdout."); exit(exitcode::IOERR); } - + if buffered_stdout.flush().is_err() { error!("Failed to flush stdout."); exit(exitcode::IOERR);