pub fn lockShared(rl: *RwLock, io: Io) Io.Cancelable!void
pub fn lockShared(rl: *RwLock, io: Io) Io.Cancelable!void { var state = @atomicLoad(usize, &rl.state, .seq_cst); while (state & (is_writing | writer_mask) == 0) { state = @cmpxchgWeak( usize, &rl.state, state, state + reader, .seq_cst, .seq_cst, ) orelse return; } try rl.mutex.lock(io); _ = @atomicRmw(usize, &rl.state, .Add, reader, .seq_cst); rl.mutex.unlock(io); }