Bugzilla Bug 307527: implement NSPR interval timer with timeGetTime instead

of QueryPerformanceCounter or GetTickCount. r=darin,bienvenu.
Modified files: pr/src/Makefile.in ntinrval.c
 Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH


git-svn-id: svn://10.0.0.236/branches/NSPRPUB_PRE_4_2_CLIENT_BRANCH@189282 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
wtchang%redhat.com
2006-02-07 02:14:25 +00:00
parent 45b08995cc
commit 8b8dd6c06a
2 changed files with 6 additions and 64 deletions

View File

@@ -198,9 +198,9 @@ endif
ifeq ($(OS_ARCH),WINNT)
ifdef NS_USE_GCC
OS_LIBS = -ladvapi32 -lwsock32
OS_LIBS = -ladvapi32 -lwsock32 -lwinmm
else
OS_LIBS = advapi32.lib wsock32.lib
OS_LIBS = advapi32.lib wsock32.lib winmm.lib
endif
endif

View File

@@ -42,83 +42,25 @@
#include "primpl.h"
#if defined(WIN16)
#include <win/compobj.h>
#define QueryPerformanceFrequency(x) FALSE
#define QueryPerformanceCounter(x) FALSE
#endif
static PRIntn _nt_bitShift = 0;
static PRInt32 _nt_ticksPerSec = -1;
void
_PR_MD_INTERVAL_INIT()
{
LARGE_INTEGER count;
if (QueryPerformanceFrequency(&count)) {
/*
* HighPart is signed (LONG). Assert that its sign bit is 0
* because we will be right shifting it. LowPart is unsigned
* (DWORD).
*/
PR_ASSERT(count.HighPart >= 0);
while(count.HighPart) {
count.LowPart = (count.HighPart << 31) + (count.LowPart >> 1);
count.HighPart >>= 1;
_nt_bitShift++;
}
while(count.LowPart > PR_INTERVAL_MAX) {
count.LowPart >>= 1;
_nt_bitShift++;
}
/*
* We can't use the performance counter if after
* normalization we are left with fewer than 32 bits.
*/
if (_nt_bitShift <= 32) {
_nt_ticksPerSec = count.LowPart;
PR_ASSERT(_nt_ticksPerSec > PR_INTERVAL_MIN);
return;
}
}
_nt_ticksPerSec = -1;
}
PRIntervalTime
_PR_MD_GET_INTERVAL()
{
LARGE_INTEGER count;
/* Sadly; nspr requires the interval to range from 1000 ticks per second
* to only 100000 ticks per second; QueryPerformanceCounter is too high
* resolution...
*/
if (_nt_ticksPerSec != -1) {
(void)QueryPerformanceCounter(&count);
PR_ASSERT(_nt_bitShift <= 32);
if (_nt_bitShift == 32) {
return (PRUint32)count.HighPart;
} else {
return (PRUint32)((count.HighPart << (32 - _nt_bitShift))
+ (count.LowPart >> _nt_bitShift));
}
} else
#if defined(__MINGW32__)
return time();
return time();
#elif defined(WIN16)
return clock(); /* milliseconds since application start */
return clock(); /* milliseconds since application start */
#else
return GetTickCount(); /* milliseconds since system start */
return timeGetTime(); /* milliseconds since system start */
#endif
}
PRIntervalTime
_PR_MD_INTERVAL_PER_SEC()
{
if (_nt_ticksPerSec != -1)
return _nt_ticksPerSec;
else
return 1000;
return 1000;
}