From 9e45ba103224554b757c77cc0b2dc93823ed62b7 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Fri, 22 Jul 2022 19:48:37 +1000 Subject: [PATCH] Impl new RAII type `helpers::flock::FileLock` that locks a file exclusive or shared Signed-off-by: Jiahao XU --- src/helpers.rs | 3 +++ src/helpers/flock.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/helpers/flock.rs diff --git a/src/helpers.rs b/src/helpers.rs index a1ef3c5f..55593da3 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -42,6 +42,9 @@ pub use tls_version::TLSVersion; mod crate_name; pub use crate_name::CrateName; +mod flock; +pub use flock::FileLock; + pub fn cargo_home() -> Result<&'static Path, io::Error> { static CARGO_HOME: OnceCell = OnceCell::new(); diff --git a/src/helpers/flock.rs b/src/helpers/flock.rs new file mode 100644 index 00000000..2c0707b5 --- /dev/null +++ b/src/helpers/flock.rs @@ -0,0 +1,45 @@ +use std::fs::File; +use std::io; +use std::ops; + +use fs4::FileExt; + +#[derive(Debug)] +pub struct FileLock(File); + +impl FileLock { + /// NOTE that this function blocks, so it cannot + /// be called in async context. + pub fn new_exclusive(file: File) -> io::Result { + file.lock_exclusive()?; + + Ok(Self(file)) + } + + /// NOTE that this function blocks, so it cannot + /// be called in async context. + pub fn new_shared(file: File) -> io::Result { + file.lock_shared()?; + + Ok(Self(file)) + } +} + +impl Drop for FileLock { + fn drop(&mut self) { + let _ = self.unlock(); + } +} + +impl ops::Deref for FileLock { + type Target = File; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl ops::DerefMut for FileLock { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +}