diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 17:03:07 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 17:03:07 +0200 |
commit | 61746b64b0e7087b17b21df6a1c7291ad25cd428 (patch) | |
tree | 5db7fd11bd116a61ed9df1ba3d94226f822c1097 /crates/runner/src/util/unix.rs | |
parent | 23a62b06d697f2beb8350347de9ea4241f1430b5 (diff) | |
download | rebel-61746b64b0e7087b17b21df6a1c7291ad25cd428.tar rebel-61746b64b0e7087b17b21df6a1c7291ad25cd428.zip |
runner: make lock() function more generic
Diffstat (limited to 'crates/runner/src/util/unix.rs')
-rw-r--r-- | crates/runner/src/util/unix.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/crates/runner/src/util/unix.rs b/crates/runner/src/util/unix.rs index 48db764..710138c 100644 --- a/crates/runner/src/util/unix.rs +++ b/crates/runner/src/util/unix.rs @@ -1,4 +1,4 @@ -use std::os::unix::prelude::*; +use std::{fs::File, os::unix::prelude::*, path::Path}; use nix::{ fcntl::{self, FcntlArg, FdFlag, OFlag}, @@ -8,6 +8,8 @@ use nix::{ use common::error::*; +use super::fs; + pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> { let flags = unsafe { OFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?) @@ -59,3 +61,24 @@ pub fn nproc() -> Result<usize> { Ok(count) } + +pub fn lock<P: AsRef<Path>>(path: P, exclusive: bool, blocking: bool) -> Result<File> { + use fcntl::FlockArg::*; + + if let Some(parent) = path.as_ref().parent() { + fs::mkdir(parent)?; + } + + let arg = match (exclusive, blocking) { + (true, true) => LockExclusive, + (true, false) => LockExclusiveNonblock, + (false, true) => LockShared, + (false, false) => LockSharedNonblock, + }; + + let file = fs::create(path.as_ref())?; + fcntl::flock(file.as_raw_fd(), arg) + .with_context(|| format!("flock failed on {:?}", path.as_ref()))?; + + Ok(file) +} |