Blocks until a permit is available and consumes a single one.
See also:
waitwaitTimeoutpub fn waitUncancelable(s: *Semaphore, io: Io) void
pub fn waitUncancelable(s: *Semaphore, io: Io) void {
s.mutex.lockUncancelable(io);
defer s.mutex.unlock(io);
while (s.permits == 0) s.cond.waitUncancelable(io, &s.mutex);
s.permits -= 1;
if (s.permits > 0) s.cond.signal(io);
}