On 01.03.2019 5:48, Liu Hao wrote: > 在 2019/3/1 上午2:09, LRN 写道: >> If the caller provides ts_nsec in struct timespec, >> we lose precision when converting that time to milliseconds >> for our WaitFor*() calls. Make sure we round *up* when doing that >> conversion, as otherwise the wait time will be *less* than the caller >> expects. Users of pthreads on non-realtime systems are generally >> OK with functions returning a bit later than requested. But timing out >> *earlier* than the requested time is completely unexpected. >> --- >> mingw-w64-libraries/winpthreads/src/misc.c | 13 ++++++++++++- >> 1 file changed, 12 insertions(+), 1 deletion(-) >> >> >> > > This seems an overkill. There is a much simpler solution: > > ``` > t += (unsigned long long) (ts->tv_nsec + 999999) / 1000000; > ``` > >
New version is attached.
From 59fb104b98567fd4a56444daa4382e9e43279856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1...@gmail.com> Date: Thu, 28 Feb 2019 17:49:49 +0000 Subject: [PATCH 1/2] Round up when converting nanoseconds to milliseconds If the caller provides ts_nsec in struct timespec, we lose precision when converting that time to milliseconds for our WaitFor*() calls. Make sure we round *up* when doing that conversion, as otherwise the wait time will be *less* than the caller expects. Users of pthreads on non-realtime systems are generally OK with functions returning a bit later than requested. But timing out *earlier* than the requested time is completely unexpected. --- mingw-w64-libraries/winpthreads/src/misc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mingw-w64-libraries/winpthreads/src/misc.c b/mingw-w64-libraries/winpthreads/src/misc.c index ab0488c..d8753f2 100644 --- a/mingw-w64-libraries/winpthreads/src/misc.c +++ b/mingw-w64-libraries/winpthreads/src/misc.c @@ -36,7 +36,8 @@ unsigned long long _pthread_time_in_ms(void) unsigned long long _pthread_time_in_ms_from_timespec(const struct timespec *ts) { unsigned long long t = (unsigned long long) ts->tv_sec * 1000LL; - t += (unsigned long long) (ts->tv_nsec / 1000000); + /* The +999999 is here to ensure that the division always rounds up */ + t += (unsigned long long) (ts->tv_nsec + 999999) / 1000000; return t; } -- 2.4.0
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public