#tokio #tokio-runtime #drop #async #async-runtime #await

tokio-async-drop

macro to enable async drop in a tokio multithreaded runtime

1 unstable release

0.1.0 Jul 2, 2023

#1464 in Asynchronous

Download history 7/week @ 2024-12-27 98/week @ 2025-01-03 169/week @ 2025-01-10 233/week @ 2025-01-17 153/week @ 2025-01-24 96/week @ 2025-01-31 192/week @ 2025-02-07 873/week @ 2025-02-14 903/week @ 2025-02-21 787/week @ 2025-02-28 758/week @ 2025-03-07 420/week @ 2025-03-14 686/week @ 2025-03-21 503/week @ 2025-03-28 423/week @ 2025-04-04 497/week @ 2025-04-11

2,268 downloads per month
Used in 6 crates

WTFPL license

5KB
63 lines

tokio-async-drop

This is a quick and dirty "hack" (not really an hack, since it's the desired behaviour of used components) to allow async drop in a tokio multithreaded runtime.

The same approach could potentially be used to allow async code in many other situations, e.g. inside a once_cell::sync::Lazy static variable.

Example

struct Foo<'a> {
    inner: &'a mut u8,
}

impl<'a> Foo<'a> {
    async fn bar(&mut self) {
        tokio::time::sleep(std::time::Duration::from_secs(1)).await;
        *self.inner = 1;
    }
}

impl<'a> Drop for Foo<'a> {
    fn drop(&mut self) {
        tokio_async_drop!({
            self.bar().await;
        });
    }
}

#[tokio::main]
async fn main() {
    let mut semaphore = 0;
    let f = Foo {
        inner: &mut semaphore,
    };
    drop(f);
    assert_eq!(semaphore, 1);
}

No runtime deps