Date: Sun, 19 Feb 2012 21:52:19 +1100 (EST) From: Bruce Evans <brde@optusnet.com.au> To: David Xu <davidxu@FreeBSD.org> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r231906 - head/lib/libthr/thread Message-ID: <20120219214118.G1461@besplex.bde.org> In-Reply-To: <201202190817.q1J8HEm1071390@svn.freebsd.org> References: <201202190817.q1J8HEm1071390@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 19 Feb 2012, David Xu wrote:
> Log:
> Check both seconds and nanoseconds are zero, only checking nanoseconds
> is zero may trigger timeout too early. It seems a copy&paste bug.
>
> Modified:
> head/lib/libthr/thread/thr_umtx.c
>
> Modified: head/lib/libthr/thread/thr_umtx.c
> ==============================================================================
> --- head/lib/libthr/thread/thr_umtx.c Sun Feb 19 07:44:38 2012 (r231905)
> +++ head/lib/libthr/thread/thr_umtx.c Sun Feb 19 08:17:14 2012 (r231906)
> @@ -205,7 +205,7 @@ _thr_umtx_timedwait_uint(volatile u_int
> if (abstime != NULL) {
> clock_gettime(clockid, &ts);
> TIMESPEC_SUB(&ts2, abstime, &ts);
> - if (ts2.tv_sec < 0 || ts2.tv_nsec <= 0)
> + if (ts2.tv_sec < 0 || (ts2.tv_sec == 0 && ts2.tv_nsec <= 0))
> return (ETIMEDOUT);
> tsp = &ts2;
> } else {
>
Use timespeccmp()? It is even likely to be faster, since it can do the
comparison in parallel, while the above has to wait for TIMESPEC_SUB()
before doing the comparison, unless the compiler is very smart.
However, I seem to have done too good a job of keeping kernel time* APIs
out of userland, so timespeccmp() is only available in the kernel, and
there are uglier but more correct unsafe macros like TIMESPEC_SUB()
macros in userland, and various kernel APIs escaped anyway, starting
with the NetBSD timeval ones, which escaped 10-15 years after timevals
should have gone away because they were superseded by timespecs.
Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120219214118.G1461>
