pub fn lock(rl: *RwLock, io: Io) Io.Cancelable!void
pub fn lock(rl: *RwLock, io: Io) Io.Cancelable!void { _ = @atomicRmw(usize, &rl.state, .Add, writer, .seq_cst); rl.mutex.lock(io) catch |err| switch (err) { error.Canceled => { _ = @atomicRmw(usize, &rl.state, .Sub, writer, .seq_cst); return error.Canceled; }, }; const state = @atomicRmw(usize, &rl.state, .Add, is_writing -% writer, .seq_cst); if (state & reader_mask != 0) rl.semaphore.wait(io) catch |err| switch (err) { error.Canceled => { rl.unlock(io); return error.Canceled; }, }; }