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

Split Win32 performance timer frequency adjustment division carefully

in two halves to avoid integer overflows after 29 days.
parent 0d2e22a5
...@@ -134,7 +134,6 @@ mtime_t mdate( void ) ...@@ -134,7 +134,6 @@ mtime_t mdate( void )
#elif defined( WIN32 ) || defined( UNDER_CE ) #elif defined( WIN32 ) || defined( UNDER_CE )
/* We don't need the real date, just the value of a high precision timer */ /* We don't need the real date, just the value of a high precision timer */
static mtime_t freq = I64C(-1); static mtime_t freq = I64C(-1);
mtime_t usec_time;
if( freq == I64C(-1) ) if( freq == I64C(-1) )
{ {
...@@ -165,9 +164,15 @@ mtime_t mdate( void ) ...@@ -165,9 +164,15 @@ mtime_t mdate( void )
if( freq != 0 ) if( freq != 0 )
{ {
/* Microsecond resolution */ LARGE_INTEGER counter;
QueryPerformanceCounter( (LARGE_INTEGER *)&usec_time ); QueryPerformanceCounter (&counter);
return ( usec_time * 1000000 ) / freq;
/* Convert to from (1/freq) to microsecond resolution */
/* We need to split the division to avoid 63-bits overflow */
lldiv_t d = lldiv (counter.QuadPart, freq);
return (d.quot * 1000000)
+ ((d.rem * 1000000) / freq);
} }
else else
{ {
...@@ -179,6 +184,7 @@ mtime_t mdate( void ) ...@@ -179,6 +184,7 @@ mtime_t mdate( void )
static CRITICAL_SECTION date_lock; static CRITICAL_SECTION date_lock;
static mtime_t i_previous_time = I64C(-1); static mtime_t i_previous_time = I64C(-1);
static int i_wrap_counts = -1; static int i_wrap_counts = -1;
mtime_t usec_time;
if( i_wrap_counts == -1 ) if( i_wrap_counts == -1 )
{ {
......
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