Function timedWait [src]
Prototype
pub fn timedWait(sem: *Semaphore, timeout_ns: u64) error{Timeout}!void
Parameters
sem: *Semaphore
timeout_ns: u64
Example
test timedWait {
var sem = Semaphore{};
try testing.expectEqual(0, sem.permits);
try testing.expectError(error.Timeout, sem.timedWait(1));
sem.post();
try testing.expectEqual(1, sem.permits);
try sem.timedWait(1);
try testing.expectEqual(0, sem.permits);
}
Source
pub fn timedWait(sem: *Semaphore, timeout_ns: u64) error{Timeout}!void {
var timeout_timer = std.time.Timer.start() catch unreachable;
sem.mutex.lock();
defer sem.mutex.unlock();
while (sem.permits == 0) {
const elapsed = timeout_timer.read();
if (elapsed > timeout_ns)
return error.Timeout;
const local_timeout_ns = timeout_ns - elapsed;
try sem.cond.timedWait(&sem.mutex, local_timeout_ns);
}
sem.permits -= 1;
if (sem.permits > 0)
sem.cond.signal();
}