2006-11-18 10:41:20 +11:00
/*
functions taken from samba4 for quick prototyping of ctdb . These are
not intended to remain part of ctdb
*/
# include "includes.h"
# include "system/time.h"
# include "system/filesys.h"
/**
return a zero timeval
*/
struct timeval timeval_zero ( void )
{
struct timeval tv ;
tv . tv_sec = 0 ;
tv . tv_usec = 0 ;
return tv ;
}
/**
return True if a timeval is zero
*/
bool timeval_is_zero ( const struct timeval * tv )
{
return tv - > tv_sec = = 0 & & tv - > tv_usec = = 0 ;
}
/**
return a timeval for the current time
*/
struct timeval timeval_current ( void )
{
struct timeval tv ;
gettimeofday ( & tv , NULL ) ;
return tv ;
}
2007-04-16 16:01:37 +10:00
double timeval_elapsed ( struct timeval * tv )
{
struct timeval tv2 = timeval_current ( ) ;
return ( tv2 . tv_sec - tv - > tv_sec ) +
( tv2 . tv_usec - tv - > tv_usec ) * 1.0e-6 ;
}
2008-07-02 13:55:59 +10:00
double timeval_delta ( struct timeval * tv2 , struct timeval * tv )
{
return ( tv2 - > tv_sec - tv - > tv_sec ) +
( tv2 - > tv_usec - tv - > tv_usec ) * 1.0e-6 ;
}
2006-11-18 10:41:20 +11:00
/**
return a timeval struct with the given elements
*/
2007-06-05 17:57:07 +10:00
_PUBLIC_ struct timeval timeval_set ( uint32_t secs , uint32_t usecs )
2006-11-18 10:41:20 +11:00
{
struct timeval tv ;
tv . tv_sec = secs ;
tv . tv_usec = usecs ;
return tv ;
}
2007-06-05 17:57:07 +10:00
_PUBLIC_ int timeval_compare ( const struct timeval * tv1 , const struct timeval * tv2 )
2006-11-18 10:41:20 +11:00
{
if ( tv1 - > tv_sec > tv2 - > tv_sec ) return 1 ;
if ( tv1 - > tv_sec < tv2 - > tv_sec ) return - 1 ;
if ( tv1 - > tv_usec > tv2 - > tv_usec ) return 1 ;
if ( tv1 - > tv_usec < tv2 - > tv_usec ) return - 1 ;
return 0 ;
}
2007-06-05 17:57:07 +10:00
_PUBLIC_ struct timeval timeval_until ( const struct timeval * tv1 ,
const struct timeval * tv2 )
2006-11-18 10:41:20 +11:00
{
struct timeval t ;
if ( timeval_compare ( tv1 , tv2 ) > = 0 ) {
return timeval_zero ( ) ;
}
t . tv_sec = tv2 - > tv_sec - tv1 - > tv_sec ;
if ( tv1 - > tv_usec > tv2 - > tv_usec ) {
t . tv_sec - - ;
t . tv_usec = 1000000 - ( tv1 - > tv_usec - tv2 - > tv_usec ) ;
} else {
t . tv_usec = tv2 - > tv_usec - tv1 - > tv_usec ;
}
return t ;
}
2007-06-05 17:57:07 +10:00
static struct timeval timeval_add ( const struct timeval * tv ,
2006-11-18 10:41:20 +11:00
uint32_t secs , uint32_t usecs )
{
struct timeval tv2 = * tv ;
const unsigned int million = 1000000 ;
tv2 . tv_sec + = secs ;
tv2 . tv_usec + = usecs ;
tv2 . tv_sec + = tv2 . tv_usec / million ;
tv2 . tv_usec = tv2 . tv_usec % million ;
return tv2 ;
}
_PUBLIC_ struct timeval timeval_current_ofs ( uint32_t secs , uint32_t usecs )
{
struct timeval tv = timeval_current ( ) ;
return timeval_add ( & tv , secs , usecs ) ;
}