]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/41157 (dtime not consistent in times reported)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 25 Aug 2009 01:47:23 +0000 (01:47 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 25 Aug 2009 01:47:23 +0000 (01:47 +0000)
2009-08-24  Steven G. Kargl  <kargl@gcc.gnu.org>

    PR fortran/41157
    * dtime.c (dtime_sub): Fix computing time increment.
    * time_1.h: Add <sys/types.h> header.  Use RUSAGE_SELF macro instead
    of a hardcoded 0.

From-SVN: r151072

libgfortran/ChangeLog
libgfortran/intrinsics/dtime.c
libgfortran/intrinsics/time_1.h

index 848fc51e71182cc04bc0d048ecd9a229f2752938..b1494ca0c50b23d3acdbb4567cffd2c917997196 100644 (file)
@@ -1,3 +1,10 @@
+2009-08-24  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/41157
+       * dtime.c (dtime_sub): Fix computing time increment.
+       * time_1.h: Add <sys/types.h> header.  Use RUSAGE_SELF macro instead
+       of a hardcoded 0.
+
 2009-08-24  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * configure.ac (AC_PREREQ): Bump to 2.64.
index 4b7000b446602b5d633372f3777d22bf1075a60e..d1eb9121ab81c383304621393c044345c06b6a24 100644 (file)
@@ -38,9 +38,10 @@ iexport_proto(dtime_sub);
 void
 dtime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
 {
-  static GFC_REAL_4 tu = 0.0, ts = 0.0, tt = 0.0;
   GFC_REAL_4 *tp;
   long user_sec, user_usec, system_sec, system_usec;
+  static long us = 0, uu = 0, ss = 0 , su = 0;
+  GFC_REAL_4 tu, ts, tt;
 
   if (((GFC_DESCRIPTOR_EXTENT(t,0))) < 2)
     runtime_error ("Insufficient number of elements in TARRAY.");
@@ -48,15 +49,19 @@ dtime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
   __gthread_mutex_lock (&dtime_update_lock);
   if (__time_1 (&user_sec, &user_usec, &system_sec, &system_usec) == 0)
     {
-      tu = (GFC_REAL_4)(user_sec + 1.e-6 * user_usec) - tu;
-      ts = (GFC_REAL_4)(system_sec + 1.e-6 * system_usec) - ts;
+      tu = (GFC_REAL_4) ((user_sec - us) + 1.e-6 * (user_usec - uu));
+      ts = (GFC_REAL_4) ((system_sec - ss) + 1.e-6 * (system_usec - su));
       tt = tu + ts;
+      us = user_sec;
+      uu = user_usec;
+      ss = system_sec;
+      su = system_usec;
     }
   else
     {
-      tu = (GFC_REAL_4)-1.0;
-      ts = (GFC_REAL_4)-1.0;
-      tt = (GFC_REAL_4)-1.0;
+      tu = -1;
+      ts = -1;
+      tt = -1;
     }
 
   tp = t->data;
index a93b7e0202a39bdfb77d1dc2b0db73ef6f2e2a12..03e14edc414398a0a4d5a68a1948807ad328baea 100644 (file)
@@ -51,6 +51,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #  endif
 #endif
 
+#ifdef HAVE_SYS_TYPES_H
+     #include <sys/types.h>
+#endif
+
 /* The most accurate way to get the CPU time is getrusage (). */
 #if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
 #  include <sys/resource.h>
@@ -112,7 +116,7 @@ __time_1 (long *user_sec, long *user_usec, long *system_sec, long *system_usec)
 {
 #if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
   struct rusage usage;
-  getrusage (0, &usage);
+  getrusage (RUSAGE_SELF, &usage);
 
   *user_sec = usage.ru_utime.tv_sec;
   *user_usec = usage.ru_utime.tv_usec;