* Functions are prototyped in mtime.h.
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
+ * $Id: mtime.c,v 1.24 2001/06/28 22:12:04 gbazin Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
#include "defs.h"
#include <stdio.h> /* sprintf() */
-#include <unistd.h> /* select() */
-#include <sys/time.h>
+
+#if defined( PTH_INIT_IN_PTH_H ) /* GNU Pth */
+# include <pth.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> /* select() */
+#endif
#ifdef HAVE_KERNEL_OS_H
-#include <kernel/OS.h>
+# include <kernel/OS.h>
+#endif
+
+#if defined( WIN32 )
+# include <windows.h>
+#else
+# include <sys/time.h>
#endif
#include "config.h"
char *mstrtime( char *psz_buffer, mtime_t date )
{
sprintf( psz_buffer, "%02d:%02d:%02d-%03d.%03d",
- (int) (date / (1000LL * 1000LL * 60LL * 60LL) % 24LL),
- (int) (date / (1000LL * 1000LL * 60LL) % 60LL),
- (int) (date / (1000LL * 1000LL) % 60LL),
- (int) (date / 1000LL % 1000LL),
- (int) (date % 1000LL) );
+ (int) (date / (I64C(1000) * I64C(1000) * I64C(60) * I64C(60)) % I64C(24)),
+ (int) (date / (I64C(1000) * I64C(1000) * I64C(60)) % I64C(60)),
+ (int) (date / (I64C(1000) * I64C(1000)) % I64C(60)),
+ (int) (date / I64C(1000) % I64C(1000)),
+ (int) (date % I64C(1000)) );
return( psz_buffer );
}
*****************************************************************************/
mtime_t mdate( void )
{
-#ifdef HAVE_KERNEL_OS_H
+#if defined( HAVE_KERNEL_OS_H )
return( real_time_clock_usecs() );
-
+
+#elif defined( WIN32 )
+ /* We don't get the real date, just the value of a high precision timer.
+ * this is because the usual time functions have at best only a milisecond
+ * resolution */
+ mtime_t freq, usec_time;
+
+ if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) )
+ {
+ /* Microsecond resolution */
+ QueryPerformanceCounter( (LARGE_INTEGER *)&usec_time );
+ return ( usec_time * 1000000 ) / freq;
+ }
+ else
+ {
+ /* Milisecond resolution */
+ return 1000 * GetTickCount();
+ }
+
#else
struct timeval tv_date;
* here, since tv is a local variable. */
gettimeofday( &tv_date, NULL );
return( (mtime_t) tv_date.tv_sec * 1000000 + (mtime_t) tv_date.tv_usec );
-
+
#endif
}
*****************************************************************************/
void mwait( mtime_t date )
{
-#ifdef HAVE_KERNEL_OS_H
-
+#if defined( HAVE_KERNEL_OS_H )
mtime_t delay;
delay = date - real_time_clock_usecs();
return;
}
snooze( delay );
-#else
-#ifdef HAVE_USLEEP
- struct timeval tv_date;
+#elif defined( WIN32 )
+ mtime_t usec_time, delay;
+
+ usec_time = mdate();
+ delay = date - usec_time;
+ if( delay <= 0 )
+ {
+ return;
+ }
+ msleep( delay );
#else
- struct timeval tv_date, tv_delay;
-#endif
+# ifdef HAVE_USLEEP
+ struct timeval tv_date;
+# else
+ struct timeval tv_date, tv_delay;
+# endif
mtime_t delay; /* delay in msec, signed to detect errors */
/* see mdate() about gettimeofday() possible errors */
gettimeofday( &tv_date, NULL );
/* calculate delay and check if current date is before wished date */
- delay = date - (mtime_t) tv_date.tv_sec * 1000000 - (mtime_t) tv_date.tv_usec - 10000;
+ delay = date - (mtime_t) tv_date.tv_sec * 1000000
+ - (mtime_t) tv_date.tv_usec
+ - 10000;
+
/* Linux/i386 has a granularity of 10 ms. It's better to be in advance
* than to be late. */
if( delay <= 0 ) /* wished date is now or already passed */
return;
}
-#ifdef HAVE_USLEEP
+# if defined( PTH_INIT_IN_PTH_H )
+ pth_usleep( delay );
+
+# elif defined( HAVE_USLEEP )
usleep( delay );
-#else
+
+# else
tv_delay.tv_sec = delay / 1000000;
tv_delay.tv_usec = delay % 1000000;
-
/* see msleep() about select() errors */
select( 0, NULL, NULL, NULL, &tv_delay );
-#endif
-#endif /* HAVE_KERNEL_OS_H */
+# endif
+
+#endif
}
/*****************************************************************************
*****************************************************************************/
void msleep( mtime_t delay )
{
-#ifdef HAVE_KERNEL_OS_H
+#if defined( HAVE_KERNEL_OS_H )
snooze( delay );
-#else
-#ifdef HAVE_USLEEP
+#elif defined( PTH_INIT_IN_PTH_H )
+ struct timeval tv_delay;
+ tv_delay.tv_sec = delay / 1000000;
+ tv_delay.tv_usec = delay % 1000000;
+ pth_select( 0, NULL, NULL, NULL, &tv_delay );
+
+#elif defined( HAVE_USLEEP )
usleep( delay );
+
+#elif defined( WIN32 )
+ Sleep( (int) (delay / 1000) );
+
#else
struct timeval tv_delay;
* (i.e. when a signal is sent to the thread, or when memory is full), and
* can be ingnored. */
select( 0, NULL, NULL, NULL, &tv_delay );
-#endif
-#endif /* HAVE_KERNEL_OS_H */
+#endif
}
+