Move sys_common::rwlock::StaticRWLock
etc. to sys::unix::rwlock
This commit is contained in:
parent
62652865b6
commit
eb9b0f6ab7
@ -21,8 +21,8 @@ use crate::slice;
|
|||||||
use crate::str;
|
use crate::str;
|
||||||
use crate::sys::cvt;
|
use crate::sys::cvt;
|
||||||
use crate::sys::fd;
|
use crate::sys::fd;
|
||||||
|
use crate::sys::rwlock::{RWLockReadGuard, StaticRWLock};
|
||||||
use crate::sys_common::mutex::{StaticMutex, StaticMutexGuard};
|
use crate::sys_common::mutex::{StaticMutex, StaticMutexGuard};
|
||||||
use crate::sys_common::rwlock::{RWLockReadGuard, StaticRWLock};
|
|
||||||
use crate::vec;
|
use crate::vec;
|
||||||
|
|
||||||
use libc::{c_char, c_int, c_void};
|
use libc::{c_char, c_int, c_void};
|
||||||
|
@ -139,3 +139,55 @@ impl RWLock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct StaticRWLock(RWLock);
|
||||||
|
|
||||||
|
impl StaticRWLock {
|
||||||
|
pub const fn new() -> StaticRWLock {
|
||||||
|
StaticRWLock(RWLock::new())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Acquires shared access to the underlying lock, blocking the current
|
||||||
|
/// thread to do so.
|
||||||
|
///
|
||||||
|
/// The lock is automatically unlocked when the returned guard is dropped.
|
||||||
|
#[inline]
|
||||||
|
pub fn read_with_guard(&'static self) -> RWLockReadGuard {
|
||||||
|
// SAFETY: All methods require static references, therefore self
|
||||||
|
// cannot be moved between invocations.
|
||||||
|
unsafe {
|
||||||
|
self.0.read();
|
||||||
|
}
|
||||||
|
RWLockReadGuard(&self.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Acquires write access to the underlying lock, blocking the current thread
|
||||||
|
/// to do so.
|
||||||
|
///
|
||||||
|
/// The lock is automatically unlocked when the returned guard is dropped.
|
||||||
|
#[inline]
|
||||||
|
pub fn write_with_guard(&'static self) -> RWLockWriteGuard {
|
||||||
|
// SAFETY: All methods require static references, therefore self
|
||||||
|
// cannot be moved between invocations.
|
||||||
|
unsafe {
|
||||||
|
self.0.write();
|
||||||
|
}
|
||||||
|
RWLockWriteGuard(&self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct RWLockReadGuard(&'static RWLock);
|
||||||
|
|
||||||
|
impl Drop for RWLockReadGuard {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe { self.0.read_unlock() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct RWLockWriteGuard(&'static RWLock);
|
||||||
|
|
||||||
|
impl Drop for RWLockWriteGuard {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe { self.0.write_unlock() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -86,62 +86,3 @@ impl RWLock {
|
|||||||
self.0.destroy()
|
self.0.destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// the cfg annotations only exist due to dead code warnings. the code itself is portable
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub struct StaticRWLock(RWLock);
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
impl StaticRWLock {
|
|
||||||
pub const fn new() -> StaticRWLock {
|
|
||||||
StaticRWLock(RWLock::new())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Acquires shared access to the underlying lock, blocking the current
|
|
||||||
/// thread to do so.
|
|
||||||
///
|
|
||||||
/// The lock is automatically unlocked when the returned guard is dropped.
|
|
||||||
#[inline]
|
|
||||||
pub fn read_with_guard(&'static self) -> RWLockReadGuard {
|
|
||||||
// SAFETY: All methods require static references, therefore self
|
|
||||||
// cannot be moved between invocations.
|
|
||||||
unsafe {
|
|
||||||
self.0.read();
|
|
||||||
}
|
|
||||||
RWLockReadGuard(&self.0)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Acquires write access to the underlying lock, blocking the current thread
|
|
||||||
/// to do so.
|
|
||||||
///
|
|
||||||
/// The lock is automatically unlocked when the returned guard is dropped.
|
|
||||||
#[inline]
|
|
||||||
pub fn write_with_guard(&'static self) -> RWLockWriteGuard {
|
|
||||||
// SAFETY: All methods require static references, therefore self
|
|
||||||
// cannot be moved between invocations.
|
|
||||||
unsafe {
|
|
||||||
self.0.write();
|
|
||||||
}
|
|
||||||
RWLockWriteGuard(&self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub struct RWLockReadGuard(&'static RWLock);
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
impl Drop for RWLockReadGuard {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
unsafe { self.0.read_unlock() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub struct RWLockWriteGuard(&'static RWLock);
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
impl Drop for RWLockWriteGuard {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
unsafe { self.0.write_unlock() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user