dtime_.c: Handle all variants of WIN32.
authorMumit Khan <khan@xraylith.wisc.edu>
Mon, 12 Apr 1999 01:25:38 +0000 (01:25 +0000)
committerJeff Law <law@gcc.gnu.org>
Mon, 12 Apr 1999 01:25:38 +0000 (19:25 -0600)
        * libU77/dtime_.c: Handle all variants of WIN32.
        * libU77/etime_.c: Likewise.

From-SVN: r26358

libf2c/ChangeLog
libf2c/libU77/dtime_.c
libf2c/libU77/etime_.c

index a899f27348d5b01e89afddea84d401ae336dbc3c..b932c06ba32bce0ae48cdecb15098aacc371b1d1 100644 (file)
@@ -1,5 +1,8 @@
 Sun Apr 11 23:30:42 1999  Mumit Khan  <khan@xraylith.wisc.edu>
 
+       * libU77/dtime_.c: Handle all variants of WIN32.
+       * libU77/etime_.c: Likewise.
+
        * libU77/aclocal.m4: New file.
        * libU77/configure.in (LIBU77_HAVE_STRUCT_TIMEZONE): Add test.
        * libU77/acconfig.h (HAVE_STRUCT_TIMEZONE): Add macro.
index 8bcfde8cb39b98dda5ca06825f84433e8cf1562d..0200a01af6fb3e1be949f4a5b8447e15c4564884 100644 (file)
@@ -33,6 +33,11 @@ Boston, MA 02111-1307, USA.  */
 #  include <sys/time.h>
 #  include <sys/resource.h>
 #endif
+#if defined (_WIN32)
+#  include <windows.h>
+#  undef min
+#  undef max
+#endif
 #include <errno.h>             /* for ENOSYS */
 #include "f2c.h"
 
@@ -50,7 +55,73 @@ double G77_dtime_0 (tarray)
 double G77_dtime_0 (real tarray[2])
 #endif
 {
-#if defined (HAVE_GETRUSAGE) || defined (HAVE_TIMES)
+#if defined (_WIN32)
+  static int win32_platform = -1;
+
+  if (win32_platform == -1)
+    {
+      OSVERSIONINFO osv;
+      osv.dwOSVersionInfoSize = sizeof (osv);
+      GetVersionEx (&osv);
+      win32_platform = osv.dwPlatformId;
+    }
+  
+  /* We need to use this hack on non-NT platforms, where the first call
+     returns 0.0 and subsequent ones return the correct value. */
+  if (win32_platform != VER_PLATFORM_WIN32_NT)
+    {
+      static unsigned long long clock_freq;
+      static unsigned long long old_count;
+      unsigned long long count;
+      double delta;
+      LARGE_INTEGER counter_val;
+
+      if (clock_freq == 0)
+       {
+         LARGE_INTEGER freq;
+         if (! QueryPerformanceFrequency (&freq))
+           {
+             errno = ENOSYS;
+             return 0.0;
+           }
+         else
+           {
+             clock_freq = ((unsigned long long) freq.HighPart << 32)
+                           + ((unsigned) freq.LowPart);
+           }
+       }
+
+      if (! QueryPerformanceCounter (&counter_val))
+       return -1.0;
+
+      count = ((unsigned long long) counter_val.HighPart << 32)
+              + (unsigned) counter_val.LowPart;
+      delta = ((double) (count - old_count)) / clock_freq;
+      tarray[0] = (float) delta;
+      tarray[1] = 0.0;
+      old_count = count;
+    }
+  else
+    {
+      static unsigned long long old_utime, old_stime;
+      unsigned long long utime, stime;
+      FILETIME creation_time, exit_time, kernel_time, user_time;
+
+      GetProcessTimes (GetCurrentProcess (), &creation_time, &exit_time,
+                      &kernel_time, &user_time);
+      utime = ((unsigned long long) user_time.dwHighDateTime << 32) 
+             + (unsigned) user_time.dwLowDateTime;
+      stime = ((unsigned long long) kernel_time.dwHighDateTime << 32) 
+             + (unsigned) kernel_time.dwLowDateTime;
+
+      tarray[0] = (utime - old_utime) / 1.0e7;
+      tarray[1] = (stime - old_stime) / 1.0e7;
+      old_utime = utime;
+      old_stime = stime;
+    }
+  return tarray[0] + tarray[1];
+
+#elif defined (HAVE_GETRUSAGE) || defined (HAVE_TIMES)
   /* The getrusage version is only the default for convenience. */
 #ifdef HAVE_GETRUSAGE
   float utime, stime;
index 269d964c75b0fa71eeec7864e942bfcc6ed88803..374fc2feba239ed3fd1f9fcf153894095176cea8 100644 (file)
@@ -33,6 +33,11 @@ Boston, MA 02111-1307, USA.  */
 #  include <sys/time.h>
 #  include <sys/resource.h>
 #endif
+#if defined (_WIN32)
+#  include <windows.h>
+#  undef min
+#  undef max
+#endif
 #include <errno.h>             /* for ENOSYS */
 #include "f2c.h"
 
@@ -50,7 +55,72 @@ double G77_etime_0 (tarray)
 double G77_etime_0 (real tarray[2])
 #endif
 {
-#if defined (HAVE_GETRUSAGE) || defined (HAVE_TIMES)
+#if defined (_WIN32)
+  static int win32_platform = -1;
+  double usertime, systime;
+
+  if (win32_platform == -1)
+    {
+      OSVERSIONINFO osv;
+      osv.dwOSVersionInfoSize = sizeof (osv);
+      GetVersionEx (&osv);
+      win32_platform = osv.dwPlatformId;
+    }
+  
+  /* non-NT platforms don't have a clue as to how long a process has
+     been running, so simply return the uptime. Bad judgement call? */
+  if (win32_platform != VER_PLATFORM_WIN32_NT)
+    {
+      static unsigned long long clock_freq;
+      static unsigned long long old_count;
+      unsigned long long count;
+      LARGE_INTEGER counter_val;
+
+      if (clock_freq == 0)
+       {
+         LARGE_INTEGER freq;
+         if (! QueryPerformanceFrequency (&freq))
+           {
+             errno = ENOSYS;
+             return 0.0;
+           }
+         else
+           {
+             clock_freq = ((unsigned long long) freq.HighPart << 32)
+                           + ((unsigned) freq.LowPart);
+             if (! QueryPerformanceCounter (&counter_val))
+               return -1.0;
+             old_count = ((unsigned long long) counter_val.HighPart << 32)
+                         + (unsigned) counter_val.LowPart;
+           }
+       }
+
+      if (! QueryPerformanceCounter (&counter_val))
+       return -1.0;
+
+      count = ((unsigned long long) counter_val.HighPart << 32)
+              + (unsigned) counter_val.LowPart;
+      tarray[0] = usertime = (double) (count - old_count) / clock_freq;
+      tarray[1] = systime = 0.0;
+    }
+  else
+    {
+      FILETIME creation_time, exit_time, kernel_time, user_time;
+      unsigned long long utime, stime;
+
+      GetProcessTimes (GetCurrentProcess (), &creation_time, &exit_time,
+                      &kernel_time, &user_time);
+      utime = ((unsigned long long) user_time.dwHighDateTime << 32)
+             + (unsigned) user_time.dwLowDateTime;
+      stime = ((unsigned long long) kernel_time.dwHighDateTime << 32)
+             + (unsigned) kernel_time.dwLowDateTime;
+
+      tarray[0] = usertime = utime / 1.0e7;
+      tarray[1] = systime = stime / 1.0e7;
+  }
+  return usertime + systime;
+
+#elif defined (HAVE_GETRUSAGE) || defined (HAVE_TIMES)
   /* The getrusage version is only the default for convenience. */
 #ifdef HAVE_GETRUSAGE
   struct rusage rbuff;