#file-descriptor #file-access #file-lock #async #lock #fd

async-fd-lock

Advisory cross-platform file locks using file descriptors with async support by spawning blocking tasks

2 unstable releases

0.2.0 Jun 23, 2024
0.1.1 Jun 23, 2024
0.1.0 Jun 23, 2024

#588 in Filesystem

Download history 17/week @ 2024-08-03 2/week @ 2024-08-10 20/week @ 2024-08-17 15/week @ 2024-08-24 973/week @ 2024-08-31 1149/week @ 2024-09-07 966/week @ 2024-09-14 1097/week @ 2024-09-21 1869/week @ 2024-09-28 1829/week @ 2024-10-05 1011/week @ 2024-10-12 919/week @ 2024-10-19 1215/week @ 2024-10-26 1079/week @ 2024-11-02 1305/week @ 2024-11-09 1654/week @ 2024-11-16

5,423 downloads per month
Used in 2 crates (via rattler_repodata_gateway)

MIT/Apache

33KB
671 lines

async-fd-lock

crates.io version downloads docs.rs docs

Advisory cross-platform file locks using file descriptors, with async support by off-loading blocking operations to newly spawned blocking tasks. Adapted from yoshuawuyts/fd-lock, which was adapted from mafintosh/fd-lock.

Note that advisory lock compliance is opt-in, and can freely be ignored by other parties. This means this crate should never be used for security purposes, but solely to coordinate file access.

Examples

Basic usage

use std::path::PathBuf;
use tokio::fs::File;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use async_fd_lock::{LockRead, LockWrite};

let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("foo.txt");

// Lock it for writing.
{
    let mut write_guard = File::options()
        .create_new(true)
        .write(true)
        .truncate(true)
        .open(&path).await?
        .lock_write().await
        .map_err(|(_, err)| err)?;
    write_guard.write(b"bongo cat").await?;
}

// Lock it for reading.
{
    let mut read_guard_1 = File::open(&path).await?.lock_read().await.map_err(|(_, err)| err)?;
    let mut read_guard_2 = File::open(&path).await?.lock_read().await.map_err(|(_, err)| err)?;
    let byte_1 = read_guard_1.read_u8().await?;
    let byte_2 = read_guard_2.read_u8().await?;
}

Installation

$ cargo add async-fd-lock

Safety

This crate uses unsafe on Windows to interface with windows-sys. All invariants have been carefully checked, and are manually enforced.

References

License

MIT OR Apache-2.0

Dependencies

~2–13MB
~166K SLoC