This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: libU77 win32 fix
- To: khan at xraylith dot wisc dot EDU
- Subject: Re: libU77 win32 fix
- From: craig at jcb-sc dot com
- Date: 18 Feb 1999 12:07:43 -0000
- Cc: egcs-patches at cygnus dot com
- Cc: craig at jcb-sc dot com
- References: <199902081856.MAA10619@modi.xraylith.wisc.edu>
This patch looks fine to me. Dave Love, if you also approve it,
let me know, and/or commit it, as you see fit.
(Mumit, does the FSF have copyright signover papers on file from
you? I don't know, offhand, where to check this info....)
tq vm, (burley)
>Patch to make life somewhat palatable on windows32.
>
>Tim Prince -- I haven't had the time to add your patches to mine yet,
>sorry; when/if this makes it into the dev branch, could you send yours
>in then?
>
>These changes have been in my windows32 binary 1.1.1 releases.
>
>Sun Feb 7 17:56:13 CST 1999 Mumit Khan <khan@xraylith.wisc.edu>
>
> * libU77/dtime_.c: Handle all variants of WIN32.
> * libU77/etime_.c: Likewise.
>
>
>Index: libf2c/libU77/dtime_.c
>===================================================================
>RCS file: /mounts/sda7/src/gnu/CVSROOT/egcs-dev/libf2c/libU77/dtime_.c,v
>retrieving revision 1.1.1.1
>diff -u -3 -p -r1.1.1.1 dtime_.c
>--- libf2c/libU77/dtime_.c 1999/02/07 23:35:52 1.1.1.1
>+++ libf2c/libU77/dtime_.c 1999/02/08 18:23:26
>@@ -1,4 +1,4 @@
>-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
>+/* Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc.
> This file is part of GNU Fortran libU77 library.
>
> This library is free software; you can redistribute it and/or modify it
>@@ -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: libf2c/libU77/etime_.c
>===================================================================
>RCS file: /mounts/sda7/src/gnu/CVSROOT/egcs-dev/libf2c/libU77/etime_.c,v
>retrieving revision 1.1.1.1
>diff -u -3 -p -r1.1.1.1 etime_.c
>--- libf2c/libU77/etime_.c 1999/02/07 23:35:52 1.1.1.1
>+++ libf2c/libU77/etime_.c 1999/02/08 18:23:30
>@@ -1,4 +1,4 @@
>-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
>+/* Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc.
> This file is part of GNU Fortran libU77 library.
>
> This library is free software; you can redistribute it and/or modify it
>@@ -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,66 @@ 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;
>+
>+ 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;
>+ 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;
>+
>+ count = ((unsigned long long) counter_val.HighPart << 32)
>+ + (unsigned) counter_val.LowPart;
>+ tarray[0] = (float) ((double) count / (double) clock_freq);
>+ tarray[1] = 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] = utime / 1.0e7;
>+ tarray[1] = stime / 1.0e7;
>+ }
>+ return tarray[0] + tarray[1];
>+
>+#elif defined (HAVE_GETRUSAGE) || defined (HAVE_TIMES)
> /* The getrusage version is only the default for convenience. */
> #ifdef HAVE_GETRUSAGE
> struct rusage rbuff;