v/vlib/v/tests/semaphore_timed_test.v

31 lines
740 B
V

// vtest flaky: true
// vtest retry: 3
import sync
import time
fn run_forever(shared foo []int, mut sem sync.Semaphore) {
for {
foo[0]++
}
sem.post() // indicate that thread is finished - never happens
}
fn test_semaphore() {
shared abc := &[0]
mut sem := sync.new_semaphore()
go run_forever(shared abc, mut sem)
for _ in 0 .. 1000 {
unsafe { abc[0]-- }
}
// wait for the 2 coroutines to finish using the semaphore
stopwatch := time.new_stopwatch()
mut elapsed := stopwatch.elapsed()
if !sem.timed_wait(200 * time.millisecond) {
// we should come here due to timeout
elapsed = stopwatch.elapsed()
}
elapsed_ms := f64(elapsed) / time.millisecond
println('elapsed: ${elapsed_ms:.1f}ms')
assert elapsed_ms >= 190.0
}