sync: make Semaphore.*wait() robust against interrupts by signals (#10491)

This commit is contained in:
Uwe Krüger 2021-06-18 11:44:18 +02:00 committed by GitHub
parent a98d644637
commit 3f5aa5e634
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 223 additions and 10 deletions

View file

@ -6,7 +6,9 @@ module sync
import time
#include <synchapi.h>
#include <time.h>
fn C.GetSystemTimeAsFileTime(lpSystemTimeAsFileTime &C._FILETIME)
fn C.InitializeConditionVariable(voidptr)
fn C.WakeConditionVariable(voidptr)
fn C.SleepConditionVariableSRW(voidptr, voidptr, u32, u32) int
@ -170,8 +172,12 @@ pub fn (mut sem Semaphore) timed_wait(timeout time.Duration) bool {
return true
}
}
mut ft_start := C._FILETIME{}
C.GetSystemTimeAsFileTime(&ft_start)
time_end := ((u64(ft_start.dwHighDateTime) << 32) | ft_start.dwLowDateTime) +
u64(timeout / (100 * time.nanosecond))
mut t_ms := u32(timeout / time.millisecond)
C.AcquireSRWLockExclusive(&sem.mtx)
t_ms := u32(timeout / time.millisecond)
mut res := 0
c = C.atomic_load_u32(&sem.count)
@ -191,11 +197,16 @@ pub fn (mut sem Semaphore) timed_wait(timeout time.Duration) bool {
break outer
}
}
C.GetSystemTimeAsFileTime(&ft_start)
time_now := ((u64(ft_start.dwHighDateTime) << 32) | ft_start.dwLowDateTime) // in 100ns
if time_now > time_end {
break outer // timeout exceeded
}
t_ms = u32((time_end - time_now) / 10000)
}
C.ReleaseSRWLockExclusive(&sem.mtx)
return res != 0
}
pub fn (s Semaphore) destroy() bool {
return true
pub fn (s Semaphore) destroy() {
}