X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_mtime.h;h=8d51250dab38177845a3c4ff2fab79e30128506c;hb=HEAD;hp=d8cfca94db08e9f2effb0cb9926bce4c121366b2;hpb=fbb8255dcf8ced858d59927cb17c4f577a8d9c15;p=vlc diff --git a/include/vlc_mtime.h b/include/vlc_mtime.h index d8cfca94db..8d51250dab 100644 --- a/include/vlc_mtime.h +++ b/include/vlc_mtime.h @@ -29,6 +29,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifndef __VLC_MTIME_H +# define __VLC_MTIME_H 1 + /***************************************************************************** * LAST_MDATE: date which will never happen ***************************************************************************** @@ -48,14 +51,6 @@ *****************************************************************************/ #define MSTRTIME_MAX_SIZE 22 -/* Well, Duh? But it does clue us in that we are converting from - millisecond quantity to a second quantity or vice versa. -*/ -#define MILLISECONDS_PER_SEC 1000 - -#define msecstotimestr(psz_buffer, msecs) \ - secstotimestr( psz_buffer, (msecs / (int) MILLISECONDS_PER_SEC) ) - /***************************************************************************** * Prototypes *****************************************************************************/ @@ -63,7 +58,64 @@ VLC_EXPORT( char *, mstrtime, ( char *psz_buffer, mtime_t date ) ); VLC_EXPORT( mtime_t, mdate, ( void ) ); VLC_EXPORT( void, mwait, ( mtime_t date ) ); VLC_EXPORT( void, msleep, ( mtime_t delay ) ); -VLC_EXPORT( char *, secstotimestr, ( char *psz_buffer, int secs ) ); +VLC_EXPORT( char *, secstotimestr, ( char *psz_buffer, int32_t secs ) ); + +# 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"))) +mtime_t impossible_delay( mtime_t delay ) +{ + (void) delay; + 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__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) +{ + return deadline; +} + +# 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 @@ -82,4 +134,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_ */