Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Jun 2012 23:59:41 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        Pawel Jakub Dawidek <pjd@freebsd.org>
Cc:        "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>
Subject:   Re: svn commit: r236909 - head/sbin/hastd
Message-ID:  <201206112359.41892.hselasky@c2i.net>
In-Reply-To: <201206112221.51793.hselasky@c2i.net>
References:  <20120611200507.GG1399@garage.freebsd.pl> <201206112221.51793.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 11 June 2012 22:21:51 Hans Petter Selasky wrote:
> On Monday 11 June 2012 22:05:07 Pawel Jakub Dawidek wrote:
> > On Mon, Jun 11, 2012 at 07:21:00PM +0000, Hans Petter Selasky wrote:
> > > Author: hselasky
> > > Date: Mon Jun 11 19:20:59 2012
> > > New Revision: 236909
> > > URL: http://svn.freebsd.org/changeset/base/236909
> > > 
> > > Log:
> > >   Use the correct clock source when computing timeouts.
> > 
> > Could you please explain why? As you can see some lines above in
> 
> > cv_init(), we initialize condition variable with CLOCK_MONOTONIC too:
> Sorry, this was a mistake clearly. I will revert ASAP. Pointyhat to me.
> 
> My test program didn't take the setattr into account.
> 
> However, while at it, what is the default clock used by
> pthread_cond_timedwait(). In libusb we don't set any clock, and can we
> depend on that CLOCK_REALTIME is the default clock used? Else I should
> probably make a patch there.
> 
> man pthread_cond_timedwait() is silent!
>

Hi,

Some more questions:

While doing my test, I traced pthread_cond_timedwait() into 
"./kern/kern_umtx.c" where the time is subtracted again, so the actual time 
value is not that important, but there are some other problems:

If the time structure argument passed to pthread_cond_timedwait() in 9-stable 
is negative, for example the seconds field, the above mentioned function will 
just return! See ./libkse/thread/thr_cond.c

int
_pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
                       const struct timespec * abstime)
{
        struct pthread  *curthread = _get_curthread();
        int     rval = 0;
        int     done = 0;
        int     mutex_locked = 1;
        int     seqno;

        THR_ASSERT(curthread->locklevel == 0,
            "cv_timedwait: locklevel is not zero!");

        if (abstime == NULL || abstime->tv_sec < 0 || abstime->tv_nsec < 0 ||
            abstime->tv_nsec >= 1000000000)
                return (EINVAL);

CLOCK_MONOTONIC: 18077 (seconds)
CLOCK_REALTIME: 1339451481 (seconds)

CLOCK_REALTIME will at some point become negative. Will libusb's timeout 
functionality stop working then, because pthread_cond_timedwait() has a check 
for negative time?

Or is hastd wrong, that it can compute a timeout offset which is outside the 
valid range, because it uses a simple:

tv_sec += timeout?
tv_sec %= 1000000000; /* Is this perhaps missing in hastd and other drivers 
???? */

What is the modulus which should be used for tv_sec?

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206112359.41892.hselasky>