Commit e2b38c96 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

mprec: thread-safety

parent f2312da8
...@@ -144,6 +144,19 @@ char *secstotimestr( char *psz_buffer, int i_seconds ) ...@@ -144,6 +144,19 @@ char *secstotimestr( char *psz_buffer, int i_seconds )
return( psz_buffer ); return( psz_buffer );
} }
#if defined (HAVE_CLOCK_NANOSLEEP)
static unsigned prec = 0;
static void mprec_once( void )
{
struct timespec ts;
if( clock_getres( CLOCK_MONOTONIC, &ts ))
clock_getres( CLOCK_REALTIME, &ts );
prec = ts.tv_nsec / 1000;
}
#endif
/** /**
* Return a value that is no bigger than the clock precision * Return a value that is no bigger than the clock precision
* (possibly zero). * (possibly zero).
...@@ -151,16 +164,14 @@ char *secstotimestr( char *psz_buffer, int i_seconds ) ...@@ -151,16 +164,14 @@ char *secstotimestr( char *psz_buffer, int i_seconds )
static inline unsigned mprec( void ) static inline unsigned mprec( void )
{ {
#if defined (HAVE_CLOCK_NANOSLEEP) #if defined (HAVE_CLOCK_NANOSLEEP)
struct timespec ts; static pthread_once_t once = PTHREAD_ONCE_INIT;
if( clock_getres( CLOCK_MONOTONIC, &ts )) pthread_once( &once, mprec_once );
clock_getres( CLOCK_REALTIME, &ts ); return prec;
#else
return ts.tv_nsec / 1000;
#endif
return 0; return 0;
#endif
} }
static unsigned prec = 0;
static volatile mtime_t cached_time = 0; static volatile mtime_t cached_time = 0;
/** /**
...@@ -315,12 +326,9 @@ mtime_t mdate( void ) ...@@ -315,12 +326,9 @@ mtime_t mdate( void )
*/ */
void mwait( mtime_t date ) void mwait( mtime_t date )
{ {
if( prec == 0 )
prec = mprec();
/* If the deadline is already elapsed, or within the clock precision, /* If the deadline is already elapsed, or within the clock precision,
* do not even bother the clock. */ * do not even bother the clock. */
if( ( date - cached_time ) < (mtime_t)prec ) // OK: mtime_t is signed if( ( date - cached_time ) < (mtime_t)mprec() ) // OK: mtime_t is signed
return; return;
#if 0 && defined (HAVE_CLOCK_NANOSLEEP) #if 0 && defined (HAVE_CLOCK_NANOSLEEP)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment