Safer primitive - relies on &mut properly, however requires more explicit handling
This commit is contained in:
parent
dd290c9774
commit
cd5aa57390
@ -100,14 +100,14 @@ impl<T> TurnHandle<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wait(&self) -> TurnLockGuard<T> {
|
pub fn wait(&mut self) -> TurnLockGuard<T> {
|
||||||
unsafe { self.raw.lock.wait(self.index) };
|
unsafe { self.raw.lock.wait(self.index) };
|
||||||
// Safety: the turn lock is now held
|
// Safety: the turn lock is now held
|
||||||
unsafe { self.guard() }
|
unsafe { self.guard() }
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn next(&self) {
|
fn next(&self) {
|
||||||
self.raw.lock.next(self.index);
|
unsafe { self.raw.lock.next(self.index) };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,19 +118,20 @@ pub struct TurnLockGuard<'a, T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T> TurnLockGuard<'a, T> {
|
impl<'a, T> TurnLockGuard<'a, T> {
|
||||||
pub fn next(self) {
|
/*pub fn next(self) {
|
||||||
drop(self)
|
drop(self)
|
||||||
}
|
}*/
|
||||||
|
|
||||||
pub fn handle(&self) -> &TurnHandle<T> {
|
pub fn handle(&self) -> &TurnHandle<T> {
|
||||||
self.handle
|
self.handle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
impl<'a, T> Drop for TurnLockGuard<'a, T> {
|
impl<'a, T> Drop for TurnLockGuard<'a, T> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe { self.handle.next() };
|
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
impl<'a, T> Deref for TurnLockGuard<'a, T> {
|
impl<'a, T> Deref for TurnLockGuard<'a, T> {
|
||||||
type Target = T;
|
type Target = T;
|
||||||
@ -158,15 +159,24 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn three_turns() {
|
fn three_turns() {
|
||||||
let mut v = TurnHandle::<()>::new(3, ());
|
let mut v = TurnHandle::<i32>::new(3, 0);
|
||||||
let t0 = v[0].wait();
|
let t0 = v[0].wait();
|
||||||
drop(t0);
|
drop(t0);
|
||||||
|
v[0].next();
|
||||||
let t1 = v[1].wait();
|
let t1 = v[1].wait();
|
||||||
drop(t1);
|
drop(t1);
|
||||||
|
v[1].next();
|
||||||
let t2 = v[2].wait();
|
let t2 = v[2].wait();
|
||||||
drop(t2);
|
drop(t2);
|
||||||
let t0 = v[0].wait();
|
v[2].next();
|
||||||
drop(t0);
|
let mut t0 = v[0].wait();
|
||||||
|
//drop(t0);
|
||||||
//assert_eq!(v[2].current(), 1);
|
//assert_eq!(v[2].current(), 1);
|
||||||
|
//let t0_prime = v[0].wait();
|
||||||
|
//*t0 += 1;
|
||||||
|
//*t0_prime += 1;
|
||||||
|
|
||||||
|
//v[0].next();
|
||||||
|
//assert_eq!(*t0_prime, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user