X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_mtime.h;h=60063eabf6c388c6026863444a5f97eb0a33e71b;hb=1cf900257c53220308faef51a94a52f4db01173d;hp=324c8eb38668717cdf1ee3adb7a45020f96d5e88;hpb=b22e2a9f33242e1fb69b9811b839fab4a97e1f23;p=vlc diff --git a/include/vlc_mtime.h b/include/vlc_mtime.h index 324c8eb386..60063eabf6 100644 --- a/include/vlc_mtime.h +++ b/include/vlc_mtime.h @@ -68,41 +68,63 @@ VLC_EXPORT( void, mwait, ( mtime_t date ) ); VLC_EXPORT( void, msleep, ( mtime_t delay ) ); VLC_EXPORT( char *, secstotimestr, ( char *psz_buffer, int secs ) ); -#ifdef __GNUC__ -# ifdef __linux__ -# define VLC_HARD_MIN_SLEEP 1000 /* Linux has 100, 250, 300 or 1000Hz */ -# else -# define VLC_HARD_MIN_SLEEP 0 -# endif -#define VLC_SOFT_MIN_SLEEP 29000000 +# define VLC_HARD_MIN_SLEEP 10000 /* 10 milliseconds = 1 tick at 100Hz */ + +#if defined (__GNUC__) \ + && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) +/* Linux has 100, 250, 300 or 1000Hz + * + * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer + */ +# define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */ static __attribute__((unused)) __attribute__((noinline)) __attribute__((error("sorry, cannot sleep for such short a time"))) -void impossible_msleep( mtime_t delay ) +mtime_t impossible_delay( mtime_t delay ) { (void) delay; - msleep( VLC_HARD_MIN_SLEEP ); + return VLC_HARD_MIN_SLEEP; +} + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((warning("use proper event handling instead of short delay"))) +mtime_t harmful_delay( mtime_t delay ) +{ + return delay; } +# define check_delay( d ) \ + ((__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ + && (d < VLC_HARD_MIN_SLEEP)) \ + ? impossible_delay(d) \ + : ((__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ + && (d < VLC_SOFT_MIN_SLEEP)) \ + ? harmful_delay(d) \ + : d)) + static __attribute__((unused)) __attribute__((noinline)) -__attribute__((warning("use proper event handling instead"))) -void bad_msleep( mtime_t delay ) +__attribute__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) { - msleep( delay ); + return deadline; } -# define msleep( d ) \ - (__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ - ? impossible_msleep(d) \ - : (__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ - ? bad_msleep(d) \ - : msleep(d))) +# define check_deadline( d ) \ + (__builtin_constant_p(d) ? impossible_deadline(d) : d) +#else +# define check_delay(d) (d) +# define check_deadline(d) (d) #endif +#define msleep(d) msleep(check_delay(d)) +#define mwait(d) mwait(check_deadline(d)) + /***************************************************************************** * date_t: date incrementation without long-term rounding errors *****************************************************************************/ @@ -120,5 +142,6 @@ VLC_EXPORT( void, date_Set, ( date_t *, mtime_t ) ); VLC_EXPORT( mtime_t, date_Get, ( const date_t * ) ); VLC_EXPORT( void, date_Move, ( date_t *, mtime_t ) ); VLC_EXPORT( mtime_t, date_Increment, ( date_t *, uint32_t ) ); +VLC_EXPORT( mtime_t, date_Decrement, ( date_t *, uint32_t ) ); VLC_EXPORT( uint64_t, NTPtime64, ( void ) ); #endif /* !__VLC_MTIME_ */