Actual source code: nt_time.c

  1: /*$Id: nt_time.c,v 1.25 2001/04/05 21:06:51 balay Exp $*/

  3: #include <petsc.h>
  4: #if defined (PARCH_win32_gnu) || defined (PARCH_win32)
  5: #include <Windows.h>
  6: #define FACTOR   4294967296.0 /* pow(2,32) */

  8: PetscLogDouble nt_time(void)
  9: {
 10:   static PetscTruth     flag = PETSC_TRUE;
 11:   int                   ierr;

 13:   static LARGE_INTEGER  StartTime,PerfFreq,CurTime;
 14:   static PetscLogDouble SecInTick=0.0;
 15: 
 16:   DWORD                 dwStartHigh,dwCurHigh;
 17:   PetscLogDouble        dTime,dHigh;
 18:   PetscLogDouble        ptime;
 19: 
 20: 
 22:   if (flag) {
 23:     QueryPerformanceCounter(&StartTime);CHKERRQ(!ierr);
 24:     QueryPerformanceFrequency(&PerfFreq);CHKERRQ(!ierr);
 25:     /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
 26:     /* works on non-pentium CPUs ? */
 27:     SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
 28:     flag = PETSC_FALSE;
 29:   }
 30: 
 31:   ierr        = QueryPerformanceCounter(&CurTime);CHKERRQ(!ierr);
 32:   dwCurHigh   = (DWORD)CurTime.HighPart;
 33:   dwStartHigh = (DWORD)StartTime.HighPart;
 34:   dHigh       = (signed)(dwCurHigh - dwStartHigh);

 36:   dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
 37:   /* Use the following with older versions of the Borland compiler
 38:   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
 39:   */
 40:   ptime = (double)SecInTick*dTime;

 42:   PetscFunctionReturn(ptime);
 43: }
 44: #endif