left-right 0.11.8

A concurrency primitive for high concurrency reads over a single-writer data structure.
Documentation
use left_right::Absorb;
use std::thread;

struct CounterAddOp(i32);
impl Absorb<CounterAddOp> for i32 {
    fn absorb_first(&mut self, operation: &mut CounterAddOp, _: &Self) {
        *self += operation.0;
    }
    fn absorb_second(&mut self, operation: CounterAddOp, _: &Self) {
        *self += operation.0;
    }
    fn sync_with(&mut self, first: &Self) {
        *self = *first
    }
}

#[test]
fn reentrant_enter_during_drop() {
    let (w, r) = left_right::new::<i32, CounterAddOp>();

    let _guard = r.enter().unwrap();
    thread::spawn(move || drop(w));

    while !r.was_dropped() {
        thread::yield_now();
    }

    assert!(r.enter().is_none());
}