diff --git a/Cargo.lock b/Cargo.lock index 951249e204..149c75c385 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -637,6 +637,7 @@ dependencies = [ "lazy_static", "libc", "log", + "parking_lot", "pin-project", "rusty_v8", "serde", diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index a326d130ed..61cf1dae68 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -17,6 +17,7 @@ use deno_core::error::uri_error; use deno_core::error::AnyError; use deno_core::futures; use deno_core::futures::future::FutureExt; +use deno_core::parking_lot::Mutex; use deno_core::ModuleSpecifier; use deno_runtime::deno_fetch::reqwest; use deno_runtime::deno_web::BlobStore; @@ -32,7 +33,6 @@ use std::io::Read; use std::path::PathBuf; use std::pin::Pin; use std::sync::Arc; -use std::sync::Mutex; static DENO_AUTH_TOKENS: &str = "DENO_AUTH_TOKENS"; pub const SUPPORTED_SCHEMES: [&str; 5] = @@ -64,12 +64,12 @@ struct FileCache(Arc>>); impl FileCache { pub fn get(&self, specifier: &ModuleSpecifier) -> Option { - let cache = self.0.lock().unwrap(); + let cache = self.0.lock(); cache.get(specifier).cloned() } pub fn insert(&self, specifier: ModuleSpecifier, file: File) -> Option { - let mut cache = self.0.lock().unwrap(); + let mut cache = self.0.lock(); cache.insert(specifier, file) } } diff --git a/cli/file_watcher.rs b/cli/file_watcher.rs index 7251dbe8c7..aee3fe787d 100644 --- a/cli/file_watcher.rs +++ b/cli/file_watcher.rs @@ -4,6 +4,7 @@ use crate::colors; use deno_core::error::AnyError; use deno_core::futures::stream::{Stream, StreamExt}; use deno_core::futures::Future; +use deno_core::parking_lot::Mutex; use log::info; use notify::event::Event as NotifyEvent; use notify::event::EventKind; @@ -17,7 +18,6 @@ use std::collections::HashSet; use std::path::PathBuf; use std::pin::Pin; use std::sync::Arc; -use std::sync::Mutex; use std::task::Context; use std::task::Poll; use std::time::Duration; @@ -54,7 +54,7 @@ impl Stream for Debounce { self: Pin<&mut Self>, cx: &mut Context, ) -> Poll> { - let mut changed_paths = self.changed_paths.lock().unwrap(); + let mut changed_paths = self.changed_paths.lock(); if changed_paths.len() > 0 { Poll::Ready(Some(changed_paths.drain().collect())) } else { @@ -232,7 +232,7 @@ fn new_watcher( .paths .iter() .filter_map(|path| path.canonicalize().ok()); - let mut changed_paths = changed_paths.lock().unwrap(); + let mut changed_paths = changed_paths.lock(); changed_paths.extend(paths); } } diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs index 0d3bf748ee..95e0bb5349 100644 --- a/cli/lsp/config.rs +++ b/cli/lsp/config.rs @@ -4,6 +4,7 @@ use crate::tokio_util::create_basic_runtime; use deno_core::error::anyhow; use deno_core::error::AnyError; +use deno_core::parking_lot::RwLock; use deno_core::serde::Deserialize; use deno_core::serde_json; use deno_core::serde_json::Value; @@ -15,7 +16,6 @@ use lspower::lsp; use std::collections::BTreeMap; use std::collections::HashMap; use std::sync::Arc; -use std::sync::RwLock; use std::thread; use tokio::sync::mpsc; @@ -241,7 +241,7 @@ impl Config { Vec<(ModuleSpecifier, ModuleSpecifier)>, Vec, ) = { - let settings = settings_ref.read().unwrap(); + let settings = settings_ref.read(); ( settings .specifiers @@ -259,7 +259,7 @@ impl Config { ) }; if let Ok(configs) = client.configuration(items).await { - let mut settings = settings_ref.write().unwrap(); + let mut settings = settings_ref.write(); for (i, value) in configs.into_iter().enumerate() { match serde_json::from_value::(value) { Ok(specifier_settings) => { @@ -276,12 +276,7 @@ impl Config { } } Some(ConfigRequest::Specifier(specifier, uri)) => { - if settings_ref - .read() - .unwrap() - .specifiers - .contains_key(&specifier) - { + if settings_ref.read().specifiers.contains_key(&specifier) { continue; } if let Ok(value) = client @@ -297,7 +292,6 @@ impl Config { Ok(specifier_settings) => { settings_ref .write() - .unwrap() .specifiers .insert(specifier, (uri, specifier_settings)); } @@ -327,14 +321,14 @@ impl Config { } pub fn get_workspace_settings(&self) -> WorkspaceSettings { - self.settings.read().unwrap().workspace.clone() + self.settings.read().workspace.clone() } /// Set the workspace settings directly, which occurs during initialization /// and when the client does not support workspace configuration requests pub fn set_workspace_settings(&self, value: Value) -> Result<(), AnyError> { let workspace_settings = serde_json::from_value(value)?; - self.settings.write().unwrap().workspace = workspace_settings; + self.settings.write().workspace = workspace_settings; Ok(()) } @@ -345,14 +339,14 @@ impl Config { settings: self .settings .try_read() - .map_err(|_| anyhow!("Error reading settings."))? + .ok_or_else(|| anyhow!("Error reading settings."))? .clone(), workspace_folders: self.workspace_folders.clone(), }) } pub fn specifier_enabled(&self, specifier: &ModuleSpecifier) -> bool { - let settings = self.settings.read().unwrap(); + let settings = self.settings.read(); settings .specifiers .get(specifier) @@ -361,7 +355,7 @@ impl Config { } pub fn specifier_code_lens_test(&self, specifier: &ModuleSpecifier) -> bool { - let settings = self.settings.read().unwrap(); + let settings = self.settings.read(); let value = settings .specifiers .get(specifier) diff --git a/cli/lsp/performance.rs b/cli/lsp/performance.rs index 87e29f3db5..74af38ec1e 100644 --- a/cli/lsp/performance.rs +++ b/cli/lsp/performance.rs @@ -1,5 +1,6 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use deno_core::parking_lot::Mutex; use deno_core::serde::Deserialize; use deno_core::serde::Serialize; use deno_core::serde_json::json; @@ -9,7 +10,6 @@ use std::collections::HashMap; use std::collections::VecDeque; use std::fmt; use std::sync::Arc; -use std::sync::Mutex; use std::time::Duration; use std::time::Instant; @@ -93,7 +93,7 @@ impl Performance { #[cfg(test)] pub fn average(&self, name: &str) -> Option<(usize, Duration)> { let mut items = Vec::new(); - for measure in self.measures.lock().unwrap().iter() { + for measure in self.measures.lock().iter() { if measure.name == name { items.push(measure.duration); } @@ -112,7 +112,7 @@ impl Performance { /// of each measurement. pub fn averages(&self) -> Vec { let mut averages: HashMap> = HashMap::new(); - for measure in self.measures.lock().unwrap().iter() { + for measure in self.measures.lock().iter() { averages .entry(measure.name.clone()) .or_default() @@ -140,7 +140,7 @@ impl Performance { maybe_args: Option, ) -> PerformanceMark { let name = name.as_ref(); - let mut counts = self.counts.lock().unwrap(); + let mut counts = self.counts.lock(); let count = counts.entry(name.to_string()).or_insert(0); *count += 1; let msg = if let Some(args) = maybe_args { @@ -179,7 +179,7 @@ impl Performance { }) ); let duration = measure.duration; - let mut measures = self.measures.lock().unwrap(); + let mut measures = self.measures.lock(); measures.push_front(measure); while measures.len() > self.max_size { measures.pop_back(); @@ -188,7 +188,7 @@ impl Performance { } pub fn to_vec(&self) -> Vec { - let measures = self.measures.lock().unwrap(); + let measures = self.measures.lock(); measures.iter().cloned().collect() } } diff --git a/cli/lsp/sources.rs b/cli/lsp/sources.rs index 37f8b6bcef..1b7d6f3fa6 100644 --- a/cli/lsp/sources.rs +++ b/cli/lsp/sources.rs @@ -19,6 +19,7 @@ use crate::text_encoding; use deno_core::error::anyhow; use deno_core::error::AnyError; +use deno_core::parking_lot::Mutex; use deno_core::serde_json; use deno_core::ModuleSpecifier; use deno_runtime::permissions::Permissions; @@ -27,7 +28,6 @@ use std::fs; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; -use std::sync::Mutex; use std::time::SystemTime; use tsc::NavigationTree; @@ -174,57 +174,57 @@ impl Sources { } pub fn contains_key(&self, specifier: &ModuleSpecifier) -> bool { - self.0.lock().unwrap().contains_key(specifier) + self.0.lock().contains_key(specifier) } pub fn get_line_index( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_line_index(specifier) + self.0.lock().get_line_index(specifier) } pub fn get_maybe_types( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_maybe_types(specifier) + self.0.lock().get_maybe_types(specifier) } pub fn get_maybe_warning( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_maybe_warning(specifier) + self.0.lock().get_maybe_warning(specifier) } pub fn get_media_type( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_media_type(specifier) + self.0.lock().get_media_type(specifier) } pub fn get_navigation_tree( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_navigation_tree(specifier) + self.0.lock().get_navigation_tree(specifier) } pub fn get_script_version( &self, specifier: &ModuleSpecifier, ) -> Option { - self.0.lock().unwrap().get_script_version(specifier) + self.0.lock().get_script_version(specifier) } pub fn get_source(&self, specifier: &ModuleSpecifier) -> Option { - self.0.lock().unwrap().get_source(specifier) + self.0.lock().get_source(specifier) } pub fn len(&self) -> usize { - self.0.lock().unwrap().metadata.len() + self.0.lock().metadata.len() } pub fn resolve_import( @@ -232,11 +232,11 @@ impl Sources { specifier: &str, referrer: &ModuleSpecifier, ) -> Option<(ModuleSpecifier, MediaType)> { - self.0.lock().unwrap().resolve_import(specifier, referrer) + self.0.lock().resolve_import(specifier, referrer) } pub fn specifiers(&self) -> Vec { - self.0.lock().unwrap().metadata.keys().cloned().collect() + self.0.lock().metadata.keys().cloned().collect() } pub fn set_navigation_tree( @@ -247,7 +247,6 @@ impl Sources { self .0 .lock() - .unwrap() .set_navigation_tree(specifier, navigation_tree) } } @@ -660,7 +659,7 @@ mod tests { let (sources, _) = setup(); let specifier = resolve_url("foo://a/b/c.ts").expect("could not create specifier"); - let sources = sources.0.lock().unwrap(); + let sources = sources.0.lock(); let mut redirects = sources.redirects.clone(); let http_cache = sources.http_cache.clone(); let actual = resolve_specifier(&specifier, &mut redirects, &http_cache); diff --git a/cli/main.rs b/cli/main.rs index eb7b4d3333..6069f44792 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -56,6 +56,7 @@ use deno_core::error::AnyError; use deno_core::futures::future::FutureExt; use deno_core::futures::Future; use deno_core::located_script_name; +use deno_core::parking_lot::Mutex; use deno_core::resolve_url_or_path; use deno_core::serde_json; use deno_core::serde_json::json; @@ -78,7 +79,6 @@ use std::path::PathBuf; use std::pin::Pin; use std::rc::Rc; use std::sync::Arc; -use std::sync::Mutex; use tools::test_runner; fn create_web_worker_callback( diff --git a/cli/module_graph.rs b/cli/module_graph.rs index e56f26c156..8ec439a8e5 100644 --- a/cli/module_graph.rs +++ b/cli/module_graph.rs @@ -32,6 +32,7 @@ use deno_core::error::AnyError; use deno_core::error::Context; use deno_core::futures::stream::FuturesUnordered; use deno_core::futures::stream::StreamExt; +use deno_core::parking_lot::Mutex; use deno_core::resolve_import; use deno_core::resolve_url_or_path; use deno_core::serde::Deserialize; @@ -55,7 +56,6 @@ use std::path::PathBuf; use std::rc::Rc; use std::result; use std::sync::Arc; -use std::sync::Mutex; use std::time::Instant; use swc_common::comments::Comment; use swc_common::BytePos; @@ -459,7 +459,7 @@ impl Module { ) -> Result { let maybe_resolve = if let Some(import_map) = self.maybe_import_map.clone() { - let import_map = import_map.lock().unwrap(); + let import_map = import_map.lock(); Some(import_map.resolve(specifier, self.specifier.as_str())?) } else { None @@ -911,7 +911,7 @@ impl Graph { root_names, })?; - let mut graph = graph.lock().unwrap(); + let mut graph = graph.lock(); graph.maybe_tsbuildinfo = response.maybe_tsbuildinfo; // Only process changes to the graph if there are no diagnostics and there // were files emitted. @@ -1047,7 +1047,7 @@ impl Graph { root_names, })?; - let graph = graph.lock().unwrap(); + let graph = graph.lock(); match options.bundle_type { BundleType::Module | BundleType::Classic => { assert!( @@ -1250,7 +1250,7 @@ impl Graph { /// Update the handler with any modules that are marked as _dirty_ and update /// any build info if present. fn flush(&mut self) -> Result<(), AnyError> { - let mut handler = self.handler.lock().unwrap(); + let mut handler = self.handler.lock(); for (_, module_slot) in self.modules.iter_mut() { if let ModuleSlot::Module(module) = module_slot { if module.is_dirty { @@ -1541,7 +1541,7 @@ impl Graph { /// error if any of the resources do not match their lock status. pub fn lock(&self) { if let Some(lf) = self.maybe_lockfile.as_ref() { - let mut lockfile = lf.lock().unwrap(); + let mut lockfile = lf.lock(); for (ms, module_slot) in self.modules.iter() { if let ModuleSlot::Module(module) = module_slot { let specifier = module.specifier.to_string(); @@ -1865,7 +1865,7 @@ impl GraphBuilder { self.graph.roots.push(specifier.clone()); self.graph.roots_dynamic = self.graph.roots_dynamic && is_dynamic; if self.graph.maybe_tsbuildinfo.is_none() { - let handler = self.graph.handler.lock().unwrap(); + let handler = self.graph.handler.lock(); self.graph.maybe_tsbuildinfo = handler.get_tsbuildinfo(specifier)?; } } @@ -1933,7 +1933,7 @@ impl GraphBuilder { .graph .modules .insert(specifier.clone(), ModuleSlot::Pending); - let mut handler = self.graph.handler.lock().unwrap(); + let mut handler = self.graph.handler.lock(); let future = handler.fetch(specifier.clone(), maybe_referrer.clone(), is_dynamic); self.pending.push(future); @@ -2003,7 +2003,7 @@ impl GraphBuilder { let has_types = module.maybe_types.is_some(); module.parse()?; if self.maybe_import_map.is_none() { - let mut handler = self.graph.handler.lock().unwrap(); + let mut handler = self.graph.handler.lock(); handler.set_deps(&specifier, module.dependencies.clone())?; if !has_types { if let Some((types, _)) = module.maybe_types.clone() { @@ -2070,10 +2070,10 @@ pub mod tests { use crate::specifier_handler::MemoryHandler; use deno_core::futures::future; + use deno_core::parking_lot::Mutex; use std::env; use std::fs; use std::path::PathBuf; - use std::sync::Mutex; macro_rules! map ( { $($key:expr => $value:expr),+ } => { @@ -2360,7 +2360,7 @@ pub mod tests { assert!(result_info.maybe_ignored_options.is_none()); assert_eq!(result_info.stats.0.len(), 12); assert!(result_info.diagnostics.is_empty()); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.cache_calls.len(), 2); assert_eq!(h.tsbuildinfo_calls.len(), 1); } @@ -2401,7 +2401,7 @@ pub mod tests { assert!(result_info.maybe_ignored_options.is_none()); assert_eq!(result_info.stats.0.len(), 12); assert!(!result_info.diagnostics.is_empty()); - let h = handler.lock().unwrap(); + let h = handler.lock(); // we shouldn't cache any files or write out tsbuildinfo if there are // diagnostic errors assert_eq!(h.cache_calls.len(), 0); @@ -2426,7 +2426,7 @@ pub mod tests { assert!(result_info.maybe_ignored_options.is_none()); assert_eq!(result_info.stats.0.len(), 12); assert!(result_info.diagnostics.is_empty()); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.cache_calls.len(), 0); assert_eq!(h.tsbuildinfo_calls.len(), 1); } @@ -2448,7 +2448,7 @@ pub mod tests { .expect("should have checked"); assert!(result_info.maybe_ignored_options.is_none()); assert!(result_info.diagnostics.is_empty()); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.cache_calls.len(), 1); assert_eq!(h.tsbuildinfo_calls.len(), 1); } @@ -2491,7 +2491,7 @@ pub mod tests { assert!(result_info.maybe_ignored_options.is_none()); assert!(result_info.diagnostics.is_empty()); let (ver0, ver1) = { - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.version_calls.len(), 2); (h.version_calls[0].1.clone(), h.version_calls[1].1.clone()) }; @@ -2512,7 +2512,7 @@ pub mod tests { .expect("should have checked"); assert!(result_info.maybe_ignored_options.is_none()); assert!(result_info.diagnostics.is_empty()); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.version_calls.len(), 2); assert!(h.version_calls[0].1 == ver0 || h.version_calls[0].1 == ver1); assert!(h.version_calls[1].1 == ver0 || h.version_calls[1].1 == ver1); @@ -2681,7 +2681,7 @@ pub mod tests { let result_info = graph.transpile(TranspileOptions::default()).unwrap(); assert_eq!(result_info.stats.0.len(), 3); assert_eq!(result_info.maybe_ignored_options, None); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.cache_calls.len(), 2); match &h.cache_calls[0].1 { Emit::Cli((code, maybe_map)) => { @@ -2743,7 +2743,7 @@ pub mod tests { vec!["target".to_string()], "the 'target' options should have been ignored" ); - let h = handler.lock().unwrap(); + let h = handler.lock(); assert_eq!(h.cache_calls.len(), 1, "only one file should be emitted"); // FIXME(bartlomieju): had to add space in `
`, probably a quirk in swc_ecma_codegen match &h.cache_calls[0].1 { diff --git a/cli/ops/runtime_compiler.rs b/cli/ops/runtime_compiler.rs index dd500077ae..b11d795004 100644 --- a/cli/ops/runtime_compiler.rs +++ b/cli/ops/runtime_compiler.rs @@ -13,6 +13,7 @@ use deno_core::error::generic_error; use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::error::Context; +use deno_core::parking_lot::Mutex; use deno_core::resolve_url_or_path; use deno_core::serde_json; use deno_core::serde_json::json; @@ -24,7 +25,6 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; use std::sync::Arc; -use std::sync::Mutex; pub fn init(rt: &mut deno_core::JsRuntime) { super::reg_async(rt, "op_emit", op_emit); diff --git a/cli/program_state.rs b/cli/program_state.rs index 5bb60906e6..264b227299 100644 --- a/cli/program_state.rs +++ b/cli/program_state.rs @@ -25,6 +25,7 @@ use deno_core::error::anyhow; use deno_core::error::get_custom_error_class; use deno_core::error::AnyError; use deno_core::error::Context; +use deno_core::parking_lot::Mutex; use deno_core::resolve_url; use deno_core::url::Url; use deno_core::ModuleSource; @@ -36,7 +37,6 @@ use std::collections::HashSet; use std::env; use std::fs::read; use std::sync::Arc; -use std::sync::Mutex; /// This structure represents state of single "deno" program. /// @@ -184,7 +184,7 @@ impl ProgramState { let debug = self.flags.log_level == Some(log::Level::Debug); let maybe_config_file = self.maybe_config_file.clone(); let reload_exclusions = { - let modules = self.modules.lock().unwrap(); + let modules = self.modules.lock(); modules.keys().cloned().collect::>() }; @@ -220,11 +220,11 @@ impl ProgramState { result_info.loadable_modules }; - let mut loadable_modules = self.modules.lock().unwrap(); + let mut loadable_modules = self.modules.lock(); loadable_modules.extend(result_modules); if let Some(ref lockfile) = self.lockfile { - let g = lockfile.lock().unwrap(); + let g = lockfile.lock(); g.write()?; } @@ -258,7 +258,7 @@ impl ProgramState { let debug = self.flags.log_level == Some(log::Level::Debug); let maybe_config_file = self.maybe_config_file.clone(); let reload_exclusions = { - let modules = self.modules.lock().unwrap(); + let modules = self.modules.lock(); modules.keys().cloned().collect::>() }; @@ -294,11 +294,11 @@ impl ProgramState { result_info.loadable_modules }; - let mut loadable_modules = self.modules.lock().unwrap(); + let mut loadable_modules = self.modules.lock(); loadable_modules.extend(result_modules); if let Some(ref lockfile) = self.lockfile { - let g = lockfile.lock().unwrap(); + let g = lockfile.lock(); g.write()?; } @@ -310,7 +310,7 @@ impl ProgramState { specifier: ModuleSpecifier, maybe_referrer: Option, ) -> Result { - let modules = self.modules.lock().unwrap(); + let modules = self.modules.lock(); modules .get(&specifier) .map(|r| match r { diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs index b1ab0174f9..6e4d39954d 100644 --- a/cli/tools/doc.rs +++ b/cli/tools/doc.rs @@ -14,6 +14,7 @@ use crate::write_to_stdout_ignore_sigpipe; use deno_core::error::AnyError; use deno_core::futures::future::FutureExt; use deno_core::futures::Future; +use deno_core::parking_lot::Mutex; use deno_core::resolve_url_or_path; use deno_doc as doc; use deno_doc::parser::DocFileLoader; @@ -21,7 +22,6 @@ use deno_runtime::permissions::Permissions; use std::path::PathBuf; use std::pin::Pin; use std::sync::Arc; -use std::sync::Mutex; use swc_ecmascript::parser::Syntax; type DocResult = Result<(Syntax, String), doc::DocError>; diff --git a/cli/tools/installer.rs b/cli/tools/installer.rs index 5877494d13..b6bb8bbb28 100644 --- a/cli/tools/installer.rs +++ b/cli/tools/installer.rs @@ -317,8 +317,8 @@ fn is_in_path(dir: &Path) -> bool { #[cfg(test)] mod tests { use super::*; + use deno_core::parking_lot::Mutex; use std::process::Command; - use std::sync::Mutex; use tempfile::TempDir; use test_util::tests_path; @@ -401,7 +401,7 @@ mod tests { #[test] fn install_basic() { - let _guard = ENV_LOCK.lock().ok(); + let _guard = ENV_LOCK.lock(); let temp_dir = TempDir::new().expect("tempdir fail"); let temp_dir_str = temp_dir.path().to_string_lossy().to_string(); // NOTE: this test overrides environmental variables @@ -591,7 +591,7 @@ mod tests { #[test] fn install_custom_dir_env_var() { - let _guard = ENV_LOCK.lock().ok(); + let _guard = ENV_LOCK.lock(); let temp_dir = TempDir::new().expect("tempdir fail"); let bin_dir = temp_dir.path().join("bin"); std::fs::create_dir(&bin_dir).unwrap(); diff --git a/cli/tools/repl.rs b/cli/tools/repl.rs index 662e1a8d7c..e3dbc5be8e 100644 --- a/cli/tools/repl.rs +++ b/cli/tools/repl.rs @@ -9,6 +9,7 @@ use crate::media_type::MediaType; use crate::program_state::ProgramState; use deno_core::error::AnyError; use deno_core::futures::FutureExt; +use deno_core::parking_lot::Mutex; use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::LocalInspectorSession; @@ -28,7 +29,6 @@ use std::borrow::Cow; use std::cell::RefCell; use std::path::PathBuf; use std::sync::Arc; -use std::sync::Mutex; use swc_ecmascript::parser::token::{Token, Word}; use tokio::sync::mpsc::channel; use tokio::sync::mpsc::unbounded_channel; @@ -324,21 +324,17 @@ impl ReplEditor { } pub fn readline(&self) -> Result { - self.inner.lock().unwrap().readline("> ") + self.inner.lock().readline("> ") } pub fn add_history_entry(&self, entry: String) { - self.inner.lock().unwrap().add_history_entry(entry); + self.inner.lock().add_history_entry(entry); } pub fn save_history(&self) -> Result<(), AnyError> { std::fs::create_dir_all(self.history_file_path.parent().unwrap())?; - self - .inner - .lock() - .unwrap() - .save_history(&self.history_file_path)?; + self.inner.lock().save_history(&self.history_file_path)?; Ok(()) } } diff --git a/cli/tsc.rs b/cli/tsc.rs index 59b4ac81a4..593dd24fb7 100644 --- a/cli/tsc.rs +++ b/cli/tsc.rs @@ -12,6 +12,7 @@ use deno_core::error::AnyError; use deno_core::error::Context; use deno_core::located_script_name; use deno_core::op_sync; +use deno_core::parking_lot::Mutex; use deno_core::resolve_url_or_path; use deno_core::serde::de; use deno_core::serde::Deserialize; @@ -27,7 +28,6 @@ use deno_core::Snapshot; use std::collections::HashMap; use std::path::PathBuf; use std::sync::Arc; -use std::sync::Mutex; // Declaration files @@ -336,7 +336,7 @@ fn op_exists(state: &mut State, args: ExistsArgs) -> Result { if specifier.scheme() == "asset" || specifier.scheme() == "data" { Ok(true) } else { - let graph = state.graph.lock().unwrap(); + let graph = state.graph.lock(); Ok(graph.contains(&specifier)) } } else { @@ -372,7 +372,7 @@ fn op_load(state: &mut State, args: Value) -> Result { media_type = MediaType::from(&v.specifier); maybe_source } else { - let graph = state.graph.lock().unwrap(); + let graph = state.graph.lock(); let specifier = if let Some(data_specifier) = state.data_url_map.get(&v.specifier) { @@ -427,7 +427,7 @@ fn op_resolve(state: &mut State, args: Value) -> Result { MediaType::from(specifier).as_ts_extension().to_string(), )); } else { - let graph = state.graph.lock().unwrap(); + let graph = state.graph.lock(); match graph.resolve(specifier, &referrer, true) { Ok(resolved_specifier) => { let media_type = if let Some(media_type) = @@ -593,9 +593,9 @@ mod tests { use crate::diagnostics::DiagnosticCategory; use crate::module_graph::tests::MockSpecifierHandler; use crate::module_graph::GraphBuilder; + use deno_core::parking_lot::Mutex; use std::env; use std::path::PathBuf; - use std::sync::Mutex; async fn setup( maybe_specifier: Option, diff --git a/core/Cargo.toml b/core/Cargo.toml index 8a5420af3c..a5a170cc83 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -19,6 +19,7 @@ indexmap = "1.6.2" lazy_static = "1.4.0" libc = "0.2.93" log = "0.4.14" +parking_lot = "0.11.1" pin-project = "1.0.6" rusty_v8 = "0.25.0" serde = { version = "1.0.125", features = ["derive"] } diff --git a/core/inspector.rs b/core/inspector.rs index f6e348d889..d8a51e601f 100644 --- a/core/inspector.rs +++ b/core/inspector.rs @@ -23,6 +23,7 @@ use crate::serde_json; use crate::serde_json::json; use crate::serde_json::Value; use crate::v8; +use parking_lot::Mutex; use std::cell::BorrowMutError; use std::cell::RefCell; use std::collections::HashMap; @@ -35,7 +36,6 @@ use std::ptr; use std::ptr::NonNull; use std::rc::Rc; use std::sync::Arc; -use std::sync::Mutex; use std::thread; /// If first argument is `None` then it's a notification, otherwise @@ -452,7 +452,7 @@ impl InspectorWaker { where F: FnOnce(&mut InspectorWakerInner) -> R, { - let mut g = self.0.lock().unwrap(); + let mut g = self.0.lock(); update_fn(&mut g) } } diff --git a/core/lib.rs b/core/lib.rs index 8c8861c799..a9f6d5d8bd 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -18,6 +18,7 @@ mod runtime; // Re-exports pub use futures; +pub use parking_lot; pub use rusty_v8 as v8; pub use serde; pub use serde_json; diff --git a/core/modules.rs b/core/modules.rs index 443120363a..7655361079 100644 --- a/core/modules.rs +++ b/core/modules.rs @@ -719,6 +719,7 @@ mod tests { use crate::OpPayload; use crate::RuntimeOptions; use futures::future::FutureExt; + use parking_lot::Mutex; use std::error::Error; use std::fmt; use std::future::Future; @@ -726,7 +727,6 @@ mod tests { use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; - use std::sync::Mutex; // TODO(ry) Sadly FuturesUnordered requires the current task to be set. So // even though we are only using poll() in these tests and not Tokio, we must @@ -856,7 +856,7 @@ mod tests { _maybe_referrer: Option, _is_dyn_import: bool, ) -> Pin> { - let mut loads = self.loads.lock().unwrap(); + let mut loads = self.loads.lock(); loads.push(module_specifier.to_string()); let url = module_specifier.to_string(); DelayedSourceCodeFuture { url, counter: 0 }.boxed() @@ -908,7 +908,7 @@ mod tests { runtime.mod_evaluate(a_id); futures::executor::block_on(runtime.run_event_loop(false)).unwrap(); - let l = loads.lock().unwrap(); + let l = loads.lock(); assert_eq!( l.to_vec(), vec![ @@ -1369,7 +1369,7 @@ mod tests { runtime.mod_evaluate(circular1_id); runtime.run_event_loop(false).await.unwrap(); - let l = loads.lock().unwrap(); + let l = loads.lock(); assert_eq!( l.to_vec(), vec![ @@ -1441,7 +1441,7 @@ mod tests { let redirect1_id = result.unwrap(); runtime.mod_evaluate(redirect1_id); runtime.run_event_loop(false).await.unwrap(); - let l = loads.lock().unwrap(); + let l = loads.lock(); assert_eq!( l.to_vec(), vec![ @@ -1517,7 +1517,7 @@ mod tests { for _ in 0..10 { let result = recursive_load.poll_unpin(&mut cx); assert!(result.is_pending()); - let l = loads.lock().unwrap(); + let l = loads.lock(); assert_eq!( l.to_vec(), vec![ @@ -1591,7 +1591,7 @@ mod tests { runtime.mod_evaluate(main_id); futures::executor::block_on(runtime.run_event_loop(false)).unwrap(); - let l = loads.lock().unwrap(); + let l = loads.lock(); assert_eq!( l.to_vec(), vec!["file:///b.js", "file:///c.js", "file:///d.js"] diff --git a/extensions/broadcast_channel/in_memory_broadcast_channel.rs b/extensions/broadcast_channel/in_memory_broadcast_channel.rs index 34498c8302..879a3dbd55 100644 --- a/extensions/broadcast_channel/in_memory_broadcast_channel.rs +++ b/extensions/broadcast_channel/in_memory_broadcast_channel.rs @@ -3,8 +3,8 @@ use crate::BroadcastChannel; use async_trait::async_trait; use deno_core::error::AnyError; +use deno_core::parking_lot::Mutex; use std::sync::Arc; -use std::sync::Mutex; use tokio::sync::broadcast; use tokio::sync::mpsc; use uuid::Uuid; @@ -41,7 +41,7 @@ impl BroadcastChannel for InMemoryBroadcastChannel { fn subscribe(&self) -> Result { let (cancel_tx, cancel_rx) = mpsc::unbounded_channel(); - let broadcast_rx = self.0.lock().unwrap().subscribe(); + let broadcast_rx = self.0.lock().subscribe(); let rx = tokio::sync::Mutex::new((broadcast_rx, cancel_rx)); let uuid = Uuid::new_v4(); Ok(Self::Resource { @@ -64,7 +64,7 @@ impl BroadcastChannel for InMemoryBroadcastChannel { let name = Arc::new(name); let data = Arc::new(data); let uuid = resource.uuid; - self.0.lock().unwrap().send(Message { name, data, uuid })?; + self.0.lock().send(Message { name, data, uuid })?; Ok(()) } diff --git a/extensions/net/ops_tls.rs b/extensions/net/ops_tls.rs index 701c5d1a18..092c74a697 100644 --- a/extensions/net/ops_tls.rs +++ b/extensions/net/ops_tls.rs @@ -28,6 +28,7 @@ use deno_core::futures::task::RawWakerVTable; use deno_core::futures::task::Waker; use deno_core::op_async; use deno_core::op_sync; +use deno_core::parking_lot::Mutex; use deno_core::AsyncRefCell; use deno_core::CancelHandle; use deno_core::CancelTryFuture; @@ -66,7 +67,6 @@ use std::path::Path; use std::pin::Pin; use std::rc::Rc; use std::sync::Arc; -use std::sync::Mutex; use std::sync::Weak; use tokio::io::AsyncRead; use tokio::io::AsyncWrite; @@ -86,11 +86,11 @@ struct ClientSessionMemoryCache(Mutex, Vec>>); impl StoresClientSessions for ClientSessionMemoryCache { fn get(&self, key: &[u8]) -> Option> { - self.0.lock().unwrap().get(key).cloned() + self.0.lock().get(key).cloned() } fn put(&self, key: Vec, value: Vec) -> bool { - let mut sessions = self.0.lock().unwrap(); + let mut sessions = self.0.lock(); // TODO(bnoordhuis) Evict sessions LRU-style instead of arbitrarily. while sessions.len() >= 1024 { let key = sessions.keys().next().unwrap().clone(); @@ -511,7 +511,6 @@ impl ReadHalf { .unwrap_or_else(|_| panic!("Arc::::try_unwrap() failed")) .tls_stream .into_inner() - .unwrap() } } @@ -597,7 +596,7 @@ impl Shared { let shared_waker = self.new_shared_waker(); let mut cx = Context::from_waker(&shared_waker); - let mut tls_stream = self.tls_stream.lock().unwrap(); + let mut tls_stream = self.tls_stream.lock(); f(Pin::new(&mut tls_stream), &mut cx) } diff --git a/extensions/web/blob.rs b/extensions/web/blob.rs index 96a9826779..bd5284317b 100644 --- a/extensions/web/blob.rs +++ b/extensions/web/blob.rs @@ -1,5 +1,6 @@ use async_trait::async_trait; use deno_core::error::type_error; +use deno_core::parking_lot::Mutex; use deno_core::url::Url; use deno_core::ZeroCopyBuf; use serde::Deserialize; @@ -8,7 +9,6 @@ use std::collections::HashMap; use std::fmt::Debug; use std::rc::Rc; use std::sync::Arc; -use std::sync::Mutex; use deno_core::error::AnyError; use uuid::Uuid; @@ -26,7 +26,7 @@ pub struct BlobStore { impl BlobStore { pub fn insert_part(&self, part: Box) -> Uuid { let id = Uuid::new_v4(); - let mut parts = self.parts.lock().unwrap(); + let mut parts = self.parts.lock(); parts.insert(id, Arc::new(part)); id } @@ -35,7 +35,7 @@ impl BlobStore { &self, id: &Uuid, ) -> Option>> { - let parts = self.parts.lock().unwrap(); + let parts = self.parts.lock(); let part = parts.get(&id); part.cloned() } @@ -44,7 +44,7 @@ impl BlobStore { &self, id: &Uuid, ) -> Option>> { - let mut parts = self.parts.lock().unwrap(); + let mut parts = self.parts.lock(); parts.remove(&id) } @@ -52,7 +52,7 @@ impl BlobStore { &self, mut url: Url, ) -> Result>, AnyError> { - let blob_store = self.object_urls.lock().unwrap(); + let blob_store = self.object_urls.lock(); url.set_fragment(None); Ok(blob_store.get(&url).cloned()) } @@ -70,14 +70,14 @@ impl BlobStore { let id = Uuid::new_v4(); let url = Url::parse(&format!("blob:{}/{}", origin, id)).unwrap(); - let mut blob_store = self.object_urls.lock().unwrap(); + let mut blob_store = self.object_urls.lock(); blob_store.insert(url.clone(), Arc::new(blob)); url } pub fn remove_object_url(&self, url: &Url) { - let mut blob_store = self.object_urls.lock().unwrap(); + let mut blob_store = self.object_urls.lock(); blob_store.remove(&url); } } diff --git a/runtime/ops/fs_events.rs b/runtime/ops/fs_events.rs index a55b02e740..ead56bdc4d 100644 --- a/runtime/ops/fs_events.rs +++ b/runtime/ops/fs_events.rs @@ -3,6 +3,7 @@ use crate::permissions::Permissions; use deno_core::error::bad_resource_id; use deno_core::error::AnyError; +use deno_core::parking_lot::Mutex; use deno_core::AsyncRefCell; use deno_core::CancelFuture; use deno_core::CancelHandle; @@ -99,11 +100,11 @@ fn op_fs_events_open( _: (), ) -> Result { let (sender, receiver) = mpsc::channel::>(16); - let sender = std::sync::Mutex::new(sender); + let sender = Mutex::new(sender); let mut watcher: RecommendedWatcher = Watcher::new_immediate(move |res: Result| { let res2 = res.map(FsEvent::from).map_err(AnyError::from); - let sender = sender.lock().unwrap(); + let sender = sender.lock(); // Ignore result, if send failed it means that watcher was already closed, // but not all messages have been flushed. let _ = sender.try_send(res2); diff --git a/runtime/permissions.rs b/runtime/permissions.rs index d78e200764..0d89fb62e1 100644 --- a/runtime/permissions.rs +++ b/runtime/permissions.rs @@ -5,6 +5,8 @@ use crate::fs_util::resolve_from_cwd; use deno_core::error::custom_error; use deno_core::error::uri_error; use deno_core::error::AnyError; +#[cfg(test)] +use deno_core::parking_lot::Mutex; use deno_core::serde::Deserialize; use deno_core::serde::Serialize; use deno_core::url; @@ -21,8 +23,6 @@ use std::path::{Path, PathBuf}; use std::sync::atomic::AtomicBool; #[cfg(test)] use std::sync::atomic::Ordering; -#[cfg(test)] -use std::sync::Mutex; const PERMISSION_EMOJI: &str = "⚠️"; @@ -1502,7 +1502,7 @@ mod tests { let mut perms: Permissions = Default::default(); #[rustfmt::skip] { - let _guard = PERMISSION_PROMPT_GUARD.lock().unwrap(); + let _guard = PERMISSION_PROMPT_GUARD.lock(); set_prompt_result(true); assert_eq!(perms.read.request(Some(&Path::new("/foo"))), PermissionState::Granted); assert_eq!(perms.read.query(None), PermissionState::Prompt); @@ -1599,7 +1599,7 @@ mod tests { hrtime: Permissions::new_hrtime(false, true), }; - let _guard = PERMISSION_PROMPT_GUARD.lock().unwrap(); + let _guard = PERMISSION_PROMPT_GUARD.lock(); set_prompt_result(true); assert!(perms.read.check(&Path::new("/foo")).is_ok()); @@ -1652,7 +1652,7 @@ mod tests { hrtime: Permissions::new_hrtime(false, true), }; - let _guard = PERMISSION_PROMPT_GUARD.lock().unwrap(); + let _guard = PERMISSION_PROMPT_GUARD.lock(); set_prompt_result(false); assert!(perms.read.check(&Path::new("/foo")).is_err());