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.
```rust 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) { tokioasyncdrop!({ self.bar().await; }); } }
async fn main() { let mut semaphore = 0; let f = Foo { inner: &mut semaphore, }; drop(f); assert_eq!(semaphore, 1); } ```