Blocks until a permit is available and consumes a single one.
Unblocks without consuming a permit when canceled or when the provided
timeout expires before a permit is available.
See also:
waitwaitUncancelablepub fn waitTimeout(s: *Semaphore, io: Io, timeout: Io.Timeout) WaitTimeoutError!void
pub fn waitTimeout(s: *Semaphore, io: Io, timeout: Io.Timeout) WaitTimeoutError!void {
const deadline = timeout.toDeadline(io);
try s.mutex.lock(io);
defer s.mutex.unlock(io);
while (s.permits == 0) try s.cond.waitTimeout(io, &s.mutex, deadline);
s.permits -= 1;
if (s.permits > 0) s.cond.signal(io);
}