aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMumit Khan <khan@xraylith.wisc.edu>1999-04-12 01:25:38 +0000
committerJeff Law <law@gcc.gnu.org>1999-04-11 19:25:38 -0600
commitd2ec29fbf1b8d9bc6778f64e3d2c7a25ea095845 (patch)
treecdf55b40c9ba161ea134658a8cdee7bdd388d271
parent2206b47188d5736643c6ce70694aa5c89e3b0bd5 (diff)
dtime_.c: Handle all variants of WIN32.
* libU77/dtime_.c: Handle all variants of WIN32. * libU77/etime_.c: Likewise. From-SVN: r26358
-rw-r--r--libf2c/ChangeLog3
-rw-r--r--libf2c/libU77/dtime_.c73
-rw-r--r--libf2c/libU77/etime_.c72
3 files changed, 146 insertions, 2 deletions
diff --git a/libf2c/ChangeLog b/libf2c/ChangeLog
index a899f27348d..b932c06ba32 100644
--- a/libf2c/ChangeLog
+++ b/libf2c/ChangeLog
@@ -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.
diff --git a/libf2c/libU77/dtime_.c b/libf2c/libU77/dtime_.c
index 8bcfde8cb39..0200a01af6f 100644
--- a/libf2c/libU77/dtime_.c
+++ b/libf2c/libU77/dtime_.c
@@ -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;
diff --git a/libf2c/libU77/etime_.c b/libf2c/libU77/etime_.c
index 269d964c75b..374fc2feba2 100644
--- a/libf2c/libU77/etime_.c
+++ b/libf2c/libU77/etime_.c
@@ -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;