Skip to content

Commit

Permalink
A little refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Mnwa committed Sep 9, 2020
1 parent 64f3231 commit 37378dc
Showing 1 changed file with 80 additions and 82 deletions.
162 changes: 80 additions & 82 deletions src/rwlock_ordered.rs
Expand Up @@ -153,14 +153,21 @@ impl<T: ?Sized> OrderedRwLock<T> {
}
}

#[inline]
fn unlock_reader(&self) {
self.unlock();
self.readers.fetch_sub(1, Ordering::AcqRel);
}

#[inline]
fn store_waker(&self, waker: &Waker) {
let _ = self.waker.compare_exchange_weak(
null_mut(),
Box::into_raw(Box::new(waker.clone())),
Ordering::AcqRel,
Ordering::Relaxed,
);
let waker_ptr = self
.waker
.swap(Box::into_raw(Box::new(waker.clone())), Ordering::AcqRel);

if !waker_ptr.is_null() {
unsafe { Box::from_raw(waker_ptr).wake() }
}
}
}

Expand Down Expand Up @@ -243,9 +250,7 @@ impl<'a, T: ?Sized> Future for OrderedRwLockWriteGuardFuture<'a, T> {
self.is_realized = true;
Poll::Ready(OrderedRwLockWriteGuard { mutex: self.mutex })
} else {
if Some(current) == self.id.checked_sub(1) {
self.mutex.store_waker(cx.waker())
}
self.mutex.store_waker(cx.waker());
Poll::Pending
}
}
Expand All @@ -262,84 +267,25 @@ impl<T: ?Sized> Future for OrderedRwLockWriteOwnedGuardFuture<T> {
mutex: self.mutex.clone(),
})
} else {
if Some(current) == self.id.checked_sub(1) {
self.mutex.store_waker(cx.waker())
}

self.mutex.store_waker(cx.waker());
Poll::Pending
}
}
}

impl<T: ?Sized> Deref for OrderedRwLockWriteGuard<'_, T> {
type Target = T;

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

impl<T: ?Sized> DerefMut for OrderedRwLockWriteGuard<'_, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *self.mutex.data.get() }
}
}

impl<T: ?Sized> Deref for OrderedRwLockWriteOwnedGuard<T> {
type Target = T;

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

impl<T: ?Sized> DerefMut for OrderedRwLockWriteOwnedGuard<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *self.mutex.data.get() }
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteGuard<'_, T> {
fn drop(&mut self) {
self.mutex.unlock()
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteOwnedGuard<T> {
fn drop(&mut self) {
self.mutex.unlock()
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteGuardFuture<'_, T> {
fn drop(&mut self) {
if !self.is_realized {
self.mutex.unlock()
}
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteOwnedGuardFuture<T> {
fn drop(&mut self) {
if !self.is_realized {
self.mutex.unlock()
}
}
}
impl<'a, T: ?Sized> Future for OrderedRwLockReadGuardFuture<'a, T> {
type Output = OrderedRwLockReadGuard<'a, T>;

fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let current = self.mutex.current.load(Ordering::Acquire);
let readers = self.mutex.readers.load(Ordering::Acquire);

if current + readers == self.id {
self.is_realized = true;
self.mutex.readers.fetch_add(1, Ordering::Release);
Poll::Ready(OrderedRwLockReadGuard { mutex: self.mutex })
Poll::Ready(OrderedRwLockReadGuard { mutex: &self.mutex })
} else {
if Some(current + readers) == self.id.checked_sub(1) {
self.mutex.store_waker(cx.waker())
}
self.mutex.store_waker(cx.waker());
Poll::Pending
}
}
Expand All @@ -351,22 +297,48 @@ impl<T: ?Sized> Future for OrderedRwLockReadOwnedGuardFuture<T> {
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let current = self.mutex.current.load(Ordering::Acquire);
let readers = self.mutex.readers.load(Ordering::Acquire);

if current + readers == self.id {
self.is_realized = true;
self.mutex.readers.fetch_add(1, Ordering::Release);
Poll::Ready(OrderedRwLockReadOwnedGuard {
mutex: self.mutex.clone(),
})
} else {
if Some(current + readers) == self.id.checked_sub(1) {
self.mutex.store_waker(cx.waker())
}

self.mutex.store_waker(cx.waker());
Poll::Pending
}
}
}

impl<T: ?Sized> Deref for OrderedRwLockWriteGuard<'_, T> {
type Target = T;

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

impl<T: ?Sized> DerefMut for OrderedRwLockWriteGuard<'_, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *self.mutex.data.get() }
}
}

impl<T: ?Sized> Deref for OrderedRwLockWriteOwnedGuard<T> {
type Target = T;

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

impl<T: ?Sized> DerefMut for OrderedRwLockWriteOwnedGuard<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *self.mutex.data.get() }
}
}

impl<T: ?Sized> Deref for OrderedRwLockReadGuard<'_, T> {
type Target = T;

Expand All @@ -385,15 +357,13 @@ impl<T: ?Sized> Deref for OrderedRwLockReadOwnedGuard<T> {

impl<T: ?Sized> Drop for OrderedRwLockReadGuard<'_, T> {
fn drop(&mut self) {
self.mutex.readers.fetch_sub(1, Ordering::Release);
self.mutex.unlock()
self.mutex.unlock_reader()
}
}

impl<T: ?Sized> Drop for OrderedRwLockReadOwnedGuard<T> {
fn drop(&mut self) {
self.mutex.readers.fetch_sub(1, Ordering::Release);
self.mutex.unlock()
self.mutex.unlock_reader()
}
}

Expand All @@ -413,14 +383,42 @@ impl<T: ?Sized> Drop for OrderedRwLockReadOwnedGuardFuture<T> {
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteGuard<'_, T> {
fn drop(&mut self) {
self.mutex.unlock()
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteOwnedGuard<T> {
fn drop(&mut self) {
self.mutex.unlock()
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteGuardFuture<'_, T> {
fn drop(&mut self) {
if !self.is_realized {
self.mutex.unlock()
}
}
}

impl<T: ?Sized> Drop for OrderedRwLockWriteOwnedGuardFuture<T> {
fn drop(&mut self) {
if !self.is_realized {
self.mutex.unlock()
}
}
}

impl<T: Debug> Debug for OrderedRwLock<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("OrderedRwLock")
.field("state", &self.state)
.field("current", &self.current)
.field("waker", &self.waker)
.field("data", &self.data)
.field("readers", &self.readers)
.field("waker", &self.waker)
.field("data", unsafe { &*self.data.get() })
.finish()
}
}
Expand Down

0 comments on commit 37378dc

Please sign in to comment.