fast-async-mutex 0.6.7

It is a lib which provide asynchronous locking mechanisms (Mutex, RwLock, OrderedMutex and OrderedRwLock)
Documentation
#[macro_use]
mod deref {
    #[macro_export]
    macro_rules! impl_deref_mut {
        ($struct_name:ident) => {
            $crate::impl_deref!($struct_name);
            impl<T: ?Sized> std::ops::DerefMut for $struct_name<T> {
                fn deref_mut(&mut self) -> &mut Self::Target {
                    unsafe { &mut *self.mutex.inner.data.get() }
                }
            }
        };
        ($struct_name:ident, $lifetime:lifetime) => {
            $crate::impl_deref!($struct_name, $lifetime);
            impl<$lifetime, T: ?Sized> std::ops::DerefMut for $struct_name<$lifetime, T> {
                fn deref_mut(&mut self) -> &mut Self::Target {
                    unsafe { &mut *self.mutex.inner.data.get() }
                }
            }
        };
    }

    #[macro_export]
    macro_rules! impl_deref {
        ($struct_name:ident) => {
            impl<T: ?Sized> std::ops::Deref for $struct_name<T> {
                type Target = T;

                fn deref(&self) -> &Self::Target {
                    unsafe { &*self.mutex.inner.data.get() }
                }
            }
        };
        ($struct_name:ident, $lifetime:lifetime) => {
            impl<$lifetime, T: ?Sized> std::ops::Deref for $struct_name<$lifetime, T> {
                type Target = T;

                fn deref(&self) -> &Self::Target {
                    unsafe { &*self.mutex.inner.data.get() }
                }
            }
        };
    }
}

#[macro_use]
mod drop {
    #[macro_export]
    macro_rules! impl_drop_guard {
        ($struct_name:ident, $unlock_fn:ident) => {
            impl<T: ?Sized> Drop for $struct_name<T> {
                fn drop(&mut self) {
                    self.mutex.inner.$unlock_fn()
                }
            }
        };
        ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
            impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
                fn drop(&mut self) {
                    self.mutex.inner.$unlock_fn()
                }
            }
        };
    }
    #[macro_export]
    macro_rules! impl_drop_guard_self {
        ($struct_name:ident, $unlock_fn:ident) => {
            impl<T: ?Sized> Drop for $struct_name<T> {
                fn drop(&mut self) {
                    self.mutex.$unlock_fn()
                }
            }
        };
        ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
            impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
                fn drop(&mut self) {
                    self.mutex.$unlock_fn()
                }
            }
        };
    }

    #[macro_export]
    macro_rules! impl_drop_guard_future {
        ($struct_name:ident, $unlock_fn:ident) => {
            impl<T: ?Sized> Drop for $struct_name<T> {
                fn drop(&mut self) {
                    if !self.is_realized {
                        self.mutex.inner.$unlock_fn()
                    }
                }
            }
        };
        ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
            impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
                fn drop(&mut self) {
                    if !self.is_realized {
                        self.mutex.inner.$unlock_fn()
                    }
                }
            }
        };
    }
}

#[macro_use]
mod sync {
    #[macro_export]
    macro_rules! impl_send_sync_rwlock {
        ($mutex_name:ident, $read_guard:ident, $read_guard_owned:ident, $write_guard:ident, $write_guard_owned:ident) => {
            unsafe impl<T> Send for $mutex_name<T> where T: Send + ?Sized {}
            unsafe impl<T> Sync for $mutex_name<T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $read_guard<'_, T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $read_guard<'_, T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $read_guard_owned<T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $read_guard_owned<T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $write_guard<'_, T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $write_guard<'_, T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $write_guard_owned<T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $write_guard_owned<T> where T: Send + Sync + ?Sized {}
        };
    }

    #[macro_export]
    macro_rules! impl_send_sync_mutex {
        ($mutex_name:ident, $mutex_guard:ident, $mutex_guard_owned:ident) => {
            unsafe impl<T> Send for $mutex_name<T> where T: Send + ?Sized {}
            unsafe impl<T> Sync for $mutex_name<T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $mutex_guard<'_, T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $mutex_guard<'_, T> where T: Send + Sync + ?Sized {}

            unsafe impl<T> Send for $mutex_guard_owned<T> where T: ?Sized + Send {}
            unsafe impl<T> Sync for $mutex_guard_owned<T> where T: Send + Sync + ?Sized {}
        };
    }
}