Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Mar 2014 15:01:34 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org
Cc:        Ryan Lortie <desrt@desrt.ca>, Baptiste Daroussin <bapt@freebsd.org>, hackers@freebsd.org
Subject:   Re: [CFR] Kevent timer improvements
Message-ID:  <201403101501.34306.jhb@freebsd.org>
In-Reply-To: <1394461730.9823.92673865.45316D77@webmail.messagingengine.com>
References:  <20140310131632.GI6900@ithaqua.etoilebsd.net> <1394461730.9823.92673865.45316D77@webmail.messagingengine.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday, March 10, 2014 10:28:50 am Ryan Lortie wrote:
> hi Baptiste,
> 
> Thanks for the patch!  This helps us a lot and is already a very good
> fit for the way we manage event times in GLib.
> 
> On Mon, Mar 10, 2014, at 9:16, Baptiste Daroussin wrote:
> > Note that NOTE_MONOTONIC is right only valid as EV_ONESHOT as the is the
> > behaviour that make sense to me concerning this kind of event, should it
> > be different? in that case what behaviour would be expected here?
> 
> Speaking somewhat philosophically, it's my opinion that an absolute
> timer that is past its timeout is something like a pipe or socket that
> has polled as ready for input, but will never be read.  In the case of a
> timer based on the real clock, the only way to reverse the condition
> would be to change the clock backwards.  For monotonic time, there is no
> way to reverse the condition.  This is distinctly different from
> periodic timers where the condition can become ready and then "more
> ready" just by the simple passage of more time.
> 
> Ideally, I don't believe that we should implicitly add EV_ONESHOT or
> even EV_CLEAR to the event mask of absolute timer events.  Although the
> user would typically want to do that for themselves, I don't believe
> that it makes sense to assume that for them -- they should have the
> choice, just as they do with pipes and sockets.

Absolute timeouts (whether CLOCK_MONOTONIC or CLOCK_REALTIME) don't make sense 
as a repeating timer, so they are "oneshot" in that sense, but I do see what 
you mean by wanting to have a timer that is level triggered and needs a manual 
clear (so no EV_CLEAR).

At this point, it would be hard to make the EV_CLEAR optional for existing 
timers without breaking lots of existing software.  OTOH, we could allow 
absolute timeouts (which are new) to require explicit EV_CLEAR.  The absolute 
timeout would just never rearm anything explicitly rather than requiring 
EV_ONESHOT to get that as a side effect.  There is actually a bug now (well, 
dead code) in the current patch where it is trying to reschedule a timer in 
filter_timerexpire() for an absolute timer.  It should look like this instead:

filt_timerexpire()
{
	...
	KNOTE_ACTIVATE(kn, 0);

	if (!(kn->kn_flags & EV_ONESHOT) && !(kn->kn_sfflags & NOTE_MONOTONIC)) {
		// rearm the timer
	}
}

Note that this removes all need for the 'flag' variable in filt_timerexpire().
You would also make the '|= EV_CLEAR' in filt_timerattach() conditional on
!(flags & NOTE_MONOTONIC).

-- 
John Baldwin



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