Date: Thu, 14 Nov 1996 12:21:48 -0500 From: Garrett Wollman <wollman@lcs.mit.edu> To: Jason Thorpe <thorpej@nas.nasa.gov> Cc: Bruce Evans <bde@zeta.org.au>, freebsd-bugs@freefall.freebsd.org Subject: Re: misc/2007: /usr/include/sys lacking timer arithmetic functions.. Message-ID: <9611141721.AA28126@halloran-eldar.lcs.mit.edu> In-Reply-To: <199611141643.IAA18936@lestat.nas.nasa.gov> References: <199611141643.IAA18936@lestat.nas.nasa.gov>
next in thread | previous in thread | raw e-mail | index | archive | help
<<On Thu, 14 Nov 1996 08:43:24 -0800, Jason Thorpe <thorpej@nas.nasa.gov> said:
> The nice things about those macros (and using them consistently everywhere)
> is that you can change the implementation of timeval math just once (such
> as the floating point hack you suggest) and have it magically fixed
> everywhere. (I'd hesitate to use the floating point hack, but that's
> not the point. :-)
For timeval subtraction, the allegedly best implementation (assuming
both positive and negative differences are permitted) is:
static inline long
TV_SUB(struct timeval *a, struct timeval *b)
{
if (a->tv_sec == b->tv_sec) /* by far the most common case */
return a->tv_usec - b->tv_usec;
if (a->tv_sec - b->tv_sec == 1) /* second-most-common */
return 1000000 + a->tv_usec - b->tv_usec;
if (a->tv_sec - b->tv_usec == -1) /* less common */
return -(1000000 + b->tv_usec - a->tv_usec);
return 1000000 * (a->tv_sec - b->tv_sec) + (a->tv_usec - b->tv_usec);
}
I have written this as an inline function, but it appears in places as
a macro with ?: operators and without the less common -1 case,
credited there to (who else?) Van Jacobson.
-GAWollman
--
Garrett A. Wollman | O Siem / We are all family / O Siem / We're all the same
wollman@lcs.mit.edu | O Siem / The fires of freedom
Opinions not those of| Dance in the burning flame
MIT, LCS, ANA, or NSA| - Susan Aglukark and Chad Irschick
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9611141721.AA28126>
