Bug 13326

Summary: [headers] [patch] additional timespecs interfaces for <sys/time.h>
Product: Base System Reporter: Kelly Yancey <kbyanc>
Component: kernAssignee: freebsd-bugs (Nobody) <bugs>
Status: Closed Not Accepted    
Severity: Affects Only Me CC: dab, imp
Priority: Normal    
Version: 3.2-STABLE   
Hardware: Any   
OS: Any   

Description Kelly Yancey 1999-08-23 01:00:00 UTC
	2 new interfaces for manipulating timeval structures in addition to
	those provided for NetBSD/OpenBSD compatibility in <sys/time.h>

	Admittingly, they aren't strickly necissary, but seeing as how they
	increase readability of code which manipulates timevals, don't add
	any bloat unless they are used (in which care they aren't bloat),
	and extend functionality already provided by <sys/time.h>, I think
	that they would make good additions to FreeBSD.


--- /usr/include/sys/time.h.orig	Sun Aug 22 18:33:57 1999
+++ /usr/include/sys/time.h		Sun Aug 22 18:45:12 1999
@@ -224,6 +224,23 @@
 	} while (0)
 #endif
 
+#ifndef KERNEL			/* additional timeval manipulations */
+#define timermul(tvp, uvp, x)						\
+	do {								\
+		(uvp)->tv_sec = (tvp)->tv_sec * x;			\
+		(uvp)->tv_usec = (tvp)->tv_usec * x;			\
+		while((uvp)->tv_usec > 1000000) {			\
+			(uvp)->tv_sec++;				\
+			(uvp)->tv_usec -= 1000000;			\
+		}							\
+	} while(0)
+#define timerdiv(tvp, uvp, x)						\
+	do {								\
+		(uvp)->tv_sec = (tvp)->tv_sec / x;			\
+		(uvp)->tv_usec = (tvp)->tv_usec / x;			\
+	} while(0)
+#endif
+
 /*
  * Names of the interval timers, and structure
  * defining a timer setting.
Comment 1 Bruce Evans 1999-08-23 09:05:02 UTC
>	2 new interfaces for manipulating timeval structures in addition to
>	those provided for NetBSD/OpenBSD compatibility in <sys/time.h>
>
>	Admittingly, they aren't strickly necissary, but seeing as how they
>	increase readability of code which manipulates timevals, don't add
>	any bloat unless they are used (in which care they aren't bloat),
>	and extend functionality already provided by <sys/time.h>, I think
>	that they would make good additions to FreeBSD.

timevals have been obsolescent for 3-4 years since POSIX blessed timespecs.
New interfaces for dealing with them shouldn't be added.

Bruce
Comment 2 kbyanc 1999-09-02 20:14:00 UTC
  Per Bruce's comments, here is a revised patch which rather than adding
interfaces for obsolete timeval structures, instead makes the timespec
operations available to user programs (basically just pulling them out of
the #ifdef KERNEL restriction). In addition, I made 4 new interfaces
including:
	multiplying and dividing timespec's by integral factors to get new
timespecs
	converting timespecs to/from quad_t's representing raw nanosecond counts.

  The latter stemmed from a recent discussion on -current where Julian
Elischer (Mon, 30 Aug 1999 17:10:03 -0700 (PDT), RE: HEADS UP) points out
that working with timevals/timespecs is messy because of having to deal with
2 variables (actually, I've seen it griped about before, but this one made
me feel like doing something about it :) ). In any event, the hope here is
to make dealing with timespecs a little easier. If people need to deal with
timevals, they are welcome to use TIMEVAL_TO_TIMESPEC and
TIMESPEC_TO_TIMEVAL to convert to timespecs before doing the
operations...or, of course, roll their own.

  Kelly
 ~kbyanc@posi.net~
  FreeBSD - The Power To Serve - http://www.freebsd.org/
  Join Team FreeBSD - http://www.posi.net/freebsd/Team-FreeBSD/

 "The ultimate result of shielding men from the effects of
  folly is to fill the world with fools." - Herbert Spencer


--- /usr/include/sys/time.h.orig	Thu Sep  2 14:35:53 1999
+++ /usr/include/sys/time.h	Thu Sep  2 14:55:59 1999
@@ -155,8 +155,6 @@
 	struct timecounter	*tc_tweak;
 };

-#ifdef KERNEL
-
 /* Operations on timespecs */
 #define	timespecclear(tvp)	((tvp)->tv_sec = (tvp)->tv_nsec = 0)
 #define	timespecisset(tvp)	((tvp)->tv_sec || (tvp)->tv_nsec)
@@ -182,6 +180,35 @@
 			(vvp)->tv_nsec += 1000000000;			\
 		}							\
 	} while (0)
+#define timespecmul(tvp, uvp, x)					\
+	do {								\
+		(uvp)->tv_sec = (tvp)->tv_sec * x;			\
+		(uvp)->tv_nsec = (tvp)->tv_nsec * x;			\
+		while((uvp)->tv_nsec > 1000000000) {			\
+			(uvp)->tv_sec++;				\
+			(uvp)->tv_nsec -= 1000000000;			\
+		}							\
+	} while(0)
+#define timespecdiv(tvp, uvp, x)					\
+	do {								\
+		(uvp)->tv_sec = (tvp)->tv_sec / x;			\
+		(uvp)->tv_nsec = (tvp)->tv_nsec / x;			\
+	} while(0)
+
+/*
+ * Operations for converting timespecs to/from quad_t's representing
+ * times in nanoseconds.
+ */
+#define tstoq(tvp, q)							\
+	do {								\
+		q = ((tvp)->tv_sec * 1000000000) + (tvp)->tv_nsec;	\
+	} while(0)
+#define qtots(q, tvp)							\
+	do {								\
+		(tvp)->tv_sec = q / 1000000000;				\
+		(tvp)->tv_nsec = q % 1000000000;			\
+	} while(0)
+#ifdef KERNEL

 /* Operations on timevals. */
Comment 3 kbyanc 1999-09-02 22:26:46 UTC
  Updates to previous patch per suggestions by Poul-Henning Kamp...

  Kelly
 ~kbyanc@posi.net~
  FreeBSD - The Power To Serve - http://www.freebsd.org/
  Join Team FreeBSD - http://www.posi.net/freebsd/Team-FreeBSD/

 "The ultimate result of shielding men from the effects of
  folly is to fill the world with fools." - Herbert Spencer


--- /usr/include/sys/time.h.orig	Thu Sep  2 14:35:53 1999
+++ /usr/include/sys/time.h	Thu Sep  2 16:41:25 1999
@@ -155,8 +155,6 @@
 	struct timecounter	*tc_tweak;
 };
 
-#ifdef KERNEL
-
 /* Operations on timespecs */
 #define	timespecclear(tvp)	((tvp)->tv_sec = (tvp)->tv_nsec = 0)
 #define	timespecisset(tvp)	((tvp)->tv_sec || (tvp)->tv_nsec)
@@ -182,6 +180,32 @@
 			(vvp)->tv_nsec += 1000000000;			\
 		}							\
 	} while (0)
+#define timespecmul(tvp, uvp, x)					\
+	do {								\
+		(uvp)->tv_sec = ((tvp)->tv_sec * x) +			\
+				(quad_t)(tvp)->tv_nsec * x / 1000000000;\
+		(uvp)->tv_nsec = (quad_t)(tvp)->tv_nsec * x % 1000000000;\
+	} while(0)
+#define timespecdiv(tvp, uvp, x)					\
+	do {								\
+		(uvp)->tv_sec = (tvp)->tv_sec / x;			\
+		(uvp)->tv_nsec = (tvp)->tv_nsec / x;			\
+	} while(0)
+
+/*
+ * Operations for converting timespecs to/from quad_t's representing
+ * times in nanoseconds.
+ */
+#define tstoq(tvp, q)							\
+	do {								\
+		q = ((tvp)->tv_sec * 1000000000) + (tvp)->tv_nsec;	\
+	} while(0)
+#define qtots(q, tvp)							\
+	do {								\
+		(tvp)->tv_sec = q / 1000000000;				\
+		(tvp)->tv_nsec = q % 1000000000;			\
+	} while(0)
+#ifdef KERNEL
 
 /* Operations on timevals. */
Comment 4 K. Macy freebsd_committer freebsd_triage 2007-11-16 08:33:17 UTC
State Changed
From-To: open->feedback


awaiting a response from phk in a separate mail 


Comment 5 K. Macy freebsd_committer freebsd_triage 2007-11-16 08:33:17 UTC
Responsible Changed
From-To: freebsd-bugs->kmacy


awaiting a response from phk in a separate mail
Comment 6 Alexander Best freebsd_committer freebsd_triage 2010-09-07 01:00:48 UTC
any news on this ancient PR's status?

cheers.
alex

-- 
a13x
Comment 7 Alexander Best freebsd_committer freebsd_triage 2010-09-22 03:27:36 UTC
State Changed
From-To: feedback->suspended

It seems the idea of having new timespecs interfaces never really caught on.
Comment 8 Gavin Atkinson freebsd_committer freebsd_triage 2011-06-01 21:29:31 UTC
Responsible Changed
From-To: kmacy->freebsd-bugs

kmacy has asked for all of his PRs to be reassigned, put back into the 
pool.
Comment 9 Eitan Adler freebsd_committer freebsd_triage 2018-05-20 23:49:52 UTC
For bugs matching the following conditions:
- Status == In Progress
- Assignee == "bugs@FreeBSD.org"
- Last Modified Year <= 2017

Do
- Set Status to "Open"
Comment 10 Warner Losh freebsd_committer freebsd_triage 2019-01-08 21:28:34 UTC
This is past it's freshness date. There's no demand for these functions, as cool as they may be, so we won't be including this in FreeBSD. Sorry for the long delay in communicating this.