You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2006/10/05 20:51:40 UTC

svn commit: r453314 - in /incubator/stdcxx/trunk/util: display.cpp exec.cpp target.h

Author: sebor
Date: Thu Oct  5 11:51:39 2006
New Revision: 453314

URL: http://svn.apache.org/viewvc?view=rev&rev=453314
Log:
2006-10-05  Andrew Black  <ab...@roguewave.com>

	* target.h: Update header comment.
	(target_status): Add wall field for wall clock timing.
	* exec.cpp [!_WIN32 && !_WIN64 && _XOPEN_UNIX] (sys/time.h): Included
	for gettimeofday.
	exec_file [!_WIN32 && !_WIN64 && _XOPEN_UNIX]: Set result->wall.
	exec_file [_WIN32 || _WIN64]: Ditto.
	* display.cpp (print_header_plain): Add column for wall clock time.
	(print_status_plain): Print result->wall, if set.

Modified:
    incubator/stdcxx/trunk/util/display.cpp
    incubator/stdcxx/trunk/util/exec.cpp
    incubator/stdcxx/trunk/util/target.h

Modified: incubator/stdcxx/trunk/util/display.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/display.cpp?view=diff&rev=453314&r1=453313&r2=453314
==============================================================================
--- incubator/stdcxx/trunk/util/display.cpp (original)
+++ incubator/stdcxx/trunk/util/display.cpp Thu Oct  5 11:51:39 2006
@@ -41,7 +41,7 @@
 static void print_header_plain ()
 {
     puts ("NAME                      STATUS ASSERTS FAILED PERCNT    USER     "
-          "SYS");
+          "SYS    WALL");
 }
 
 /**
@@ -81,18 +81,22 @@
         printf (" %7u %6u %5d%%", status->assert, status->failed, 
                 100 * (status->assert - status->failed) / status->assert);
     }
-    else if (valid_timing)
+    else if (valid_timing || status->wall)
         printf ("                      ");
 
     /* Print timings, if available */
     if (valid_timing)
-        printf (" %3ld.%03ld %3ld.%03ld\n", status->user->tv_sec,
+        printf (" %3ld.%03ld %3ld.%03ld", status->user->tv_sec,
                 status->user->tv_usec/1000, status->sys->tv_sec,
                 status->sys->tv_usec/1000);
-    else {
-        puts ("");
-    }
+    else if (status->wall)
+        printf ("                ");
 
+    if (status->wall)
+        printf (" %3ld.%03ld\n", status->wall->tv_sec,
+                status->wall->tv_usec/1000);
+    else
+        puts ("");
 }
 
 /**

Modified: incubator/stdcxx/trunk/util/exec.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/exec.cpp?view=diff&rev=453314&r1=453313&r2=453314
==============================================================================
--- incubator/stdcxx/trunk/util/exec.cpp (original)
+++ incubator/stdcxx/trunk/util/exec.cpp Thu Oct  5 11:51:39 2006
@@ -42,6 +42,7 @@
 #  include <sys/wait.h>
 #  ifdef _XOPEN_UNIX
 #    include <sys/resource.h> /* for setlimit(), RLIMIT_CORE, ... */
+#    include <sys/time.h> /* for gettimeofday */
 #  endif
 #else
 #  include <windows.h> /* for PROCESS_INFORMATION, ... */
@@ -871,9 +872,27 @@
               strerror (errno));
     }
     else {
+#ifdef _XOPEN_UNIX
+        struct timeval start;
+        static struct timeval delta;
+        gettimeofday(&start, 0);
+#endif /* _XOPEN_UNIX */
         /* parent */
         wait_for_child (child_pid, options->timeout, result);
         calculate_usage (result);
+#ifdef _XOPEN_UNIX
+        gettimeofday(&delta, 0);
+        delta.tv_sec -= start.tv_sec;
+        delta.tv_usec -= start.tv_usec;
+
+        /* Adjust seconds/microseconds */
+        if (delta.tv_usec < 0) {
+            --delta.tv_sec;
+            delta.tv_usec += 1000000;
+        }
+        /* Link the delta */
+        result->wall = &delta;
+#endif /* _XOPEN_UNIX */
     }
 }
 #else  /* _WIN{32,64} */
@@ -1080,6 +1099,8 @@
     SECURITY_ATTRIBUTES child_sa = /* SA for inheritable handle. */
           {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE};
     DWORD real_timeout, wait_code;
+    FILETIME start, end, delta;
+    static rw_timeval convert;
 
     assert (0 != options);
     assert (0 != options->argv);
@@ -1126,6 +1147,10 @@
        and general-protection-fault message boxes */
     UINT old_mode = SetErrorMode (SEM_FAILCRITICALERRORS
                                 | SEM_NOGPFAULTERRORBOX);
+
+    /* Check the wall clock before creating the process */
+    GetSystemTimeAsFileTime(&start);
+
     /* Create the child process */
     if (0 == CreateProcess (options->argv [0], merged, 0, 0, 1, 
         CREATE_NEW_PROCESS_GROUP, 0, 0, &context, &child)) {
@@ -1170,6 +1195,25 @@
         result->status = ST_SYSTEM_ERROR;
         warn_last_error ("Waiting for child process");
     }
+
+    /* Calculate wall clock time elapsed while the process ran */
+    GetSystemTimeAsFileTime(&end);
+    delta.dwHighDateTime = end.dwHighDateTime - start.dwHighDateTime;
+    delta.dwLowDateTime = end.dwLowDateTime - start.dwLowDateTime;
+
+    /* Handle subtraction across the boundry */
+    if (end.dwLowDateTime < start.dwLowDateTime)
+        --delta.dwHighDateTime;
+
+    /* Convert from 128 bit number to seconds/microseconds */
+    convert.tv_usec = delta.dwLowDateTime % 10000000;
+    convert.tv_sec = (delta.dwLowDateTime - convert.tv_usec) / 10000000;
+    /* The low half of the date has a resolution of 100 nanoseconds, and
+       a magnitude of ~584 years.  Therefore, the upper half shouldn't 
+       matter. */
+
+    /* Link the delta */
+    result->wall = &convert;
 
     if (0 == GetExitCodeProcess (child.hProcess, (LPDWORD)&result->exit)) {
         warn_last_error ("Retrieving child process exit code");

Modified: incubator/stdcxx/trunk/util/target.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/target.h?view=diff&rev=453314&r1=453313&r2=453314
==============================================================================
--- incubator/stdcxx/trunk/util/target.h (original)
+++ incubator/stdcxx/trunk/util/target.h Thu Oct  5 11:51:39 2006
@@ -1,6 +1,6 @@
 /************************************************************************
  *
- * cmdopt.h - Interface declaration for the option parsing subsystem
+ * target.h - Struct definitions for target execution and results.
  *
  * $Id$
  *
@@ -140,6 +140,7 @@
     enum ProcessStatus status; /**< Textual process status. */
     const rw_timeval* user; /**< Elapsed user time spent in execution. */
     const rw_timeval* sys; /**< Elapsed system time spent in execution. */
+    const rw_timeval* wall; /**< Wall clock time spent in execution. */
     unsigned warn; /**< Number of (test) warnings. */
     unsigned assert; /**< Number of (test) assertions. */
     unsigned failed; /**< Number of failed (test) assertions. */