[Spread-cvs] commit: r877 - in trunk/libspread-util: include src

jschultz at spread.org jschultz at spread.org
Mon Jan 23 03:22:11 EST 2017


Author: jschultz
Date: 2017-01-23 03:22:11 -0500 (Mon, 23 Jan 2017)
New Revision: 877

Modified:
   trunk/libspread-util/include/spu_events.h
   trunk/libspread-util/src/events.c
Log:
Exported E_get_time_monotonic
Minor changes to time functions



Modified: trunk/libspread-util/include/spu_events.h
===================================================================
--- trunk/libspread-util/include/spu_events.h	2016-11-22 20:35:44 UTC (rev 876)
+++ trunk/libspread-util/include/spu_events.h	2017-01-23 08:22:11 UTC (rev 877)
@@ -33,11 +33,15 @@
  *
  */
 
-
-
 #ifndef	INC_SP_EVENTS
 #define	INC_SP_EVENTS
 
+#include <stddef.h>
+
+#ifndef NULL
+#  define NULL ((void*) 0)
+#endif
+
 /* Raise this number AND RECOMPILE events.c to handle more active FD's. 
  * This number limits the number of connections that 
  * can be handled.
@@ -62,20 +66,22 @@
 	long	usec;
 } sp_time;
 
-#ifndef NULL
-#define NULL    (void *)0
-#endif
-
 /* Event routines */
 
 int 	E_init(void);
+
 sp_time	E_get_time(void);
+sp_time E_get_time_monotonic(void);
+
+sp_time E_neg_time( sp_time t );
+sp_time	E_add_time( sp_time t, sp_time delta_t );
 sp_time	E_sub_time( sp_time t, sp_time delta_t );
-sp_time	E_add_time( sp_time t, sp_time delta_t );
+
 /* if t1 > t2 then returns 1;
    if t1 < t2 then returns -1;
    if t1 == t2 then returns 0; */
 int	E_compare_time( sp_time t1, sp_time t2 );
+
 int 	E_queue( void (* func)( int code, void *data ), int code, void *data,
 		 sp_time delta_time );
 int     E_in_queue( void (* func)( int code, void *data ), int code,
@@ -84,6 +90,7 @@
    *data pointer */
 int 	E_dequeue( void (* func)( int code, void *data ), int code,
 		   void *data );
+
 void	E_delay( sp_time t );
 
 int	E_attach_fd( int fd, int fd_type,

Modified: trunk/libspread-util/src/events.c
===================================================================
--- trunk/libspread-util/src/events.c	2016-11-22 20:35:44 UTC (rev 876)
+++ trunk/libspread-util/src/events.c	2017-01-23 08:22:11 UTC (rev 877)
@@ -98,8 +98,6 @@
 	fd_event	events[MAX_FD_EVENTS];
 } fd_queue;
 
-static sp_time E_get_time_monotonic(void);
-
 static	time_event	*Time_queue;
 static	sp_time		Now;
 
@@ -159,27 +157,21 @@
 }
 
 sp_time	E_get_time(void)
+#ifndef	ARCH_PC_WIN95
 {
-        sp_time t;
+        struct timeval read_time;
+        sp_time        t;
 
-#ifndef	ARCH_PC_WIN95
-        struct timeval  read_time;
-
-#if HAVE_STRUCT_TIMEZONE
-        struct timezone dummy_tz;
-#else
-	sp_time		dummy_tz;
-#endif
-	int		ret;
-
-	ret = gettimeofday( &read_time, &dummy_tz );
-	if ( ret < 0 ) Alarmp( SPLOG_FATAL, EVENTS, "E_get_time: gettimeofday problems.\n" );
+	gettimeofday( &read_time, NULL );
         t.sec  = read_time.tv_sec;
         t.usec = read_time.tv_usec;
 
+        return t;
+}
 #else	/* ARCH_PC_WIN95 */
-
+{
 	struct _timeb timebuffer;
+        sp_time       t;
 
 	_ftime( &timebuffer );
 
@@ -187,71 +179,102 @@
 	t.usec  = (long) timebuffer.millitm;
 	t.usec *= 1000;	
 
+        return t;
+}
 #endif	/* ARCH_PC_WIN95 */
-#if 0
-	Alarmp( SPLOG_INFO, EVENTS, "E_get_time: time is (%d, %d)\n", t.sec, t.usec);
-#endif
-	return ( t );
-}
 
-static sp_time E_get_time_monotonic(void)
+/* TODO: add a monotonic clock for Windows (QueryPerformanceCounter, QueryPerformanceFrequency), OSX too */
+/* TODO: implement division as 64b multiplication by a fixed point reciprocal: http://homepage.divms.uiowa.edu/~jones/bcd/divide.html */
+
+sp_time E_get_time_monotonic(void)
 #ifdef HAVE_CLOCK_GETTIME_CLOCK_MONOTONIC
 {
-  struct timespec t;
+        struct timespec t;
 
-  if (clock_gettime(CLOCK_MONOTONIC, &t) != 0) {
-    Alarmp( SPLOG_FATAL, EVENTS, "E_get_time_monotonic: clock_gettime problems: %d '%s'\n", errno, strerror(errno) );
-  }
+        clock_gettime( CLOCK_MONOTONIC, &t );
+        Now.sec  = (long) t.tv_sec;
+        Now.usec = (long) ( ( t.tv_nsec + 500 ) / 1000 );
 
-  Now.sec  = t.tv_sec;
-  Now.usec = (t.tv_nsec + 500) / 1000;
-
-  return Now;
+        return Now;
 }
 #else
 {
-  Now = E_get_time();
+        Now = E_get_time();
 
-  return Now;
+        return Now;
 }
 #endif
 
-sp_time	E_sub_time( sp_time t, sp_time delta_t )
+sp_time E_neg_time( sp_time t )
 {
-	sp_time	res;
+        t.sec  = -t.sec;
+        t.usec = -t.usec;
 
-	res.sec  = t.sec  - delta_t.sec;
-	res.usec = t.usec - delta_t.usec;
-	if ( res.usec < 0 )
-	{
-		res.usec = res.usec + 1000000;
-		res.sec--;
-	} 
-	if ( res.sec < 0 ) Alarmp( SPLOG_INFO, EVENTS, "E_sub_time: negative time result.\n");
-	return ( res );
+        return t;
 }
 
 sp_time	E_add_time( sp_time t, sp_time delta_t )
 {
-	sp_time	res;
+        /* we assume that .usec is in open range (-1000000, +1000000) */
+        
+	t.sec  += delta_t.sec;
+	t.usec += delta_t.usec;
 
-	res.sec  = t.sec  + delta_t.sec;
-	res.usec = t.usec + delta_t.usec;
-	if ( res.usec > 1000000 )
+        /* force .usec to be back in open range (-1000000, +1000000) */
+        
+	if ( t.usec >= 1000000 )
 	{
-		res.usec = res.usec - 1000000;
-		res.sec++;
+		t.usec -= 1000000;
+		++t.sec;
 	}
-	return ( res );
+        else if ( t.usec <= -1000000 )
+        {
+                t.usec += 1000000;
+                --t.sec;
+        }
+
+        /* enforce that .sec and .usec have same sign */
+        
+        if ( t.sec > 0 )
+        {
+                if ( t.usec < 0 )
+                {
+                        t.usec += 1000000;
+                        --t.sec;
+                }
+        }
+        else if ( t.sec < 0 )
+        {
+                if ( t.usec > 0 )
+                {
+                        t.usec -= 1000000;
+                        ++t.sec;
+                }
+        }
+        
+	return t;
 }
 
+sp_time	E_sub_time( sp_time t, sp_time delta_t )
+{
+        return E_add_time( t, E_neg_time( delta_t ) );
+}
+
 int	E_compare_time( sp_time t1, sp_time t2 )
 {
-	if	( t1.sec  > t2.sec  ) return (  1 );
-	else if ( t1.sec  < t2.sec  ) return ( -1 );
-	else if ( t1.usec > t2.usec ) return (  1 );
-	else if ( t1.usec < t2.usec ) return ( -1 );
-	else			      return (  0 );
+	if ( t1.sec > t2.sec  )
+                return 1;
+        
+	if ( t1.sec < t2.sec  )
+                return -1;
+        
+	if ( t1.usec > t2.usec )
+                return 1;
+        
+	if ( t1.usec < t2.usec )
+                return -1;
+        
+	return 0;
 }
 
 int 	E_queue( void (* func)( int code, void *data ), int code, void *data,




More information about the Spread-cvs mailing list