summaryrefslogtreecommitdiff
path: root/ext/fs/sync.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-07-25 23:43:00 +0200
committerGitHub <noreply@github.com>2023-07-25 23:43:00 +0200
commit06209f824cf398bcd3332dc37f2d22cbdd840647 (patch)
tree4aa5dc460363953f4bb9ab08011bbd75df8a95e1 /ext/fs/sync.rs
parent5d8d1105a408b0e1f1a89a0d9e3c3cffddd640ab (diff)
perf: cache node resolution when accesing a global (#19930)
Reclaims some of the performance hit introduced by https://github.com/denoland/deno/pull/19307.
Diffstat (limited to 'ext/fs/sync.rs')
-rw-r--r--ext/fs/sync.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/ext/fs/sync.rs b/ext/fs/sync.rs
index c43850c28..749e4ee02 100644
--- a/ext/fs/sync.rs
+++ b/ext/fs/sync.rs
@@ -5,10 +5,42 @@ pub use inner::*;
#[cfg(feature = "sync_fs")]
mod inner {
#![allow(clippy::disallowed_types)]
+
+ use std::ops::Deref;
+ use std::ops::DerefMut;
pub use std::sync::Arc as MaybeArc;
pub use core::marker::Send as MaybeSend;
pub use core::marker::Sync as MaybeSync;
+
+ pub struct MaybeArcMutexGuard<'lock, T>(std::sync::MutexGuard<'lock, T>);
+
+ impl<'lock, T> Deref for MaybeArcMutexGuard<'lock, T> {
+ type Target = std::sync::MutexGuard<'lock, T>;
+ fn deref(&self) -> &std::sync::MutexGuard<'lock, T> {
+ &self.0
+ }
+ }
+
+ impl<'lock, T> DerefMut for MaybeArcMutexGuard<'lock, T> {
+ fn deref_mut(&mut self) -> &mut std::sync::MutexGuard<'lock, T> {
+ &mut self.0
+ }
+ }
+
+ #[derive(Debug)]
+ pub struct MaybeArcMutex<T>(std::sync::Arc<std::sync::Mutex<T>>);
+ impl<T> MaybeArcMutex<T> {
+ pub fn new(val: T) -> Self {
+ Self(std::sync::Arc::new(std::sync::Mutex::new(val)))
+ }
+ }
+
+ impl<'lock, T> MaybeArcMutex<T> {
+ pub fn lock(&'lock self) -> MaybeArcMutexGuard<'lock, T> {
+ MaybeArcMutexGuard(self.0.lock().unwrap())
+ }
+ }
}
#[cfg(not(feature = "sync_fs"))]
@@ -19,4 +51,33 @@ mod inner {
impl<T> MaybeSync for T where T: ?Sized {}
pub trait MaybeSend {}
impl<T> MaybeSend for T where T: ?Sized {}
+
+ pub struct MaybeArcMutexGuard<'lock, T>(std::cell::RefMut<'lock, T>);
+
+ impl<'lock, T> Deref for MaybeArcMutexGuard<'lock, T> {
+ type Target = std::cell::RefMut<'lock, T>;
+ fn deref(&self) -> &std::cell::RefMut<'lock, T> {
+ &self.0
+ }
+ }
+
+ impl<'lock, T> DerefMut for MaybeArcMutexGuard<'lock, T> {
+ fn deref_mut(&mut self) -> &mut std::cell::RefMut<'lock, T> {
+ &mut self.0
+ }
+ }
+
+ #[derive(Debug)]
+ pub struct MaybeArcMutex<T>(std::rc::Rc<std::cell::RefCell<T>>);
+ impl<T> MaybeArcMutex<T> {
+ pub fn new(val: T) -> Self {
+ Self(std::rc::Rc::new(std::cell::RefCell::new(val)))
+ }
+ }
+
+ impl<'lock, T> MaybeArcMutex<T> {
+ pub fn lock(&'lock self) -> MaybeArcMutexGuard<'lock, T> {
+ MaybeArcMutexGuard(self.0.borrow_mut())
+ }
+ }
}