Hi all, 3 of 8) Add direct_util_monotonic_pthread_cond_init and direct_util_get_monotonic_pthread_timeout interface So pthread_cond_timedwait will not affected by system date/time changes.
Regards, diff --git a/lib/direct/util.c b/lib/direct/util.c index fd245b9..8601816 100644 --- a/lib/direct/util.c +++ b/lib/direct/util.c @@ -37,6 +37,11 @@ #include <direct/mem.h> #include <direct/messages.h> #include <direct/util.h> +#include <direct/clock.h> + +#include <sys/syscall.h> + +static int no_monotonic_pthread_clock; /* * translates errno to DirectResult @@ -243,6 +248,58 @@ direct_util_recursive_pthread_mutex_init( pthread_mutex_t *mutex ) } /* + * Utility function to initialize monotonic condition. + */ +int +direct_util_monotonic_pthread_cond_init( pthread_cond_t *cond ) +{ + int ret; + pthread_condattr_t attr; + +#ifdef CLOCK_MONOTONIC + struct timespec dummy; + + if(!no_monotonic_pthread_clock) { + if((syscall( __NR_clock_getres, CLOCK_MONOTONIC, &dummy ) == 0) && + (pthread_condattr_setclock( &attr, CLOCK_MONOTONIC ) == 0)) + ; + else + no_monotonic_pthread_clock = 1; + } +#endif + pthread_condattr_init( &cond ); + ret = pthread_cond_init( cond, &attr ); + if (ret) + D_PERROR( "Direct/Lock: Could not initialize monotonic condition!\n" ); + + pthread_condattr_destroy( &attr ); + + return ret; +} + +/* + * Utility function to calibrate timeout for monotonic condition. + */ +void +direct_util_get_monotonic_pthread_timeout( struct timespec *timeout, + int seconds, + int nano_seconds ) +{ + struct timeval now; + + if(no_monotonic_pthread_clock) + gettimeofday( &now, NULL ); + else + direct_monotonic_gettimeofday( &now ); + + timeout->tv_sec = now.tv_sec + seconds; + timeout->tv_nsec = (now.tv_usec * 1000) + nano_seconds; + + timeout->tv_sec += timeout->tv_nsec / 1000000000; + timeout->tv_nsec %= 1000000000; +} + +/* * Encode/Decode Base-64. */ char* diff --git a/lib/direct/util.h b/lib/direct/util.h index f8b1f00..521763d 100644 --- a/lib/direct/util.h +++ b/lib/direct/util.h @@ -225,6 +225,17 @@ direct_util_align( int value, */ int direct_util_recursive_pthread_mutex_init( pthread_mutex_t *mutex ); +/* + * Utility function to calibrate timeout for monotonic condition. + */ +void direct_util_get_monotonic_pthread_timeout( struct timespec *timeout, + int seconds, + int nano_seconds ); + +/* + * Utility function to initialize monotonic condition. + */ +int direct_util_monotonic_pthread_cond_init( pthread_cond_t *cond ); /* floor and ceil implementation to get rid of libm */ _______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev