[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