Re: [PATCH] MI: new timing command

Nick Roberts
2007-01-28T05:31:09Z

> > Well it was explained to me that get_run_time basically returns wallclock
> > time when getrusage isn't defined.
>
> Not necessarily. Take a look at getruntime.c: it can use `times' when
> that is available. `times' returns the sum of user and system times,
> not the wallclock time.

I don't recollect this point being made earlier but anyway I've tried to make
the necessary changes below.

--
Nick http://www.inet.net.nz/~nickrob

Other changes as before. In particular mi-main.c is a pseudo diff as other
previous changes aren't shown.

*** mi-parse.h 28 Jan 2007 10:54:38 +1300 1.6
--- mi-parse.h 28 Jan 2007 18:18:46 +1300
***************
*** 24,29 ****
--- 24,36 ----

/* MI parser */

+ /* Timestamps for current command and last asynchronous command. */
+ struct mi_timestamp {
+ struct timeval wallclock;
+ struct timeval utime;
+ struct timeval stime;
+ };
+
enum mi_command_type
{
MI_COMMAND, CLI_COMMAND
*************** struct mi_parse
*** 35,40 ****
--- 42,48 ----
char *command;
char *token;
const struct mi_cmd *cmd;
+ struct mi_timestamp *cmd_start;
char *args;
char **argv;
int argc;

*** mi-main.c 23 Jan 2007 20:21:56 +1300 1.91
--- mi-main.c 28 Jan 2007 18:15:17 +1300
*************** _initialize_mi_main (void)
*** 1457,1459 ****
--- 1517,1565 ----
DEPRECATED_REGISTER_GDBARCH_SWAP (old_regs);
deprecated_register_gdbarch_swap (NULL, 0, mi_setup_architecture_data);
}
+
+ static void
+ timestamp (struct mi_timestamp *tv)
+ {
+ long usec;
+ gettimeofday (&tv->wallclock, NULL);
+ #ifdef HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &rusage);
+ tv->utime.tv_sec = rusage.ru_utime.tv_sec;
+ tv->utime.tv_usec = rusage.ru_utime.tv_usec;
+ tv->stime.tv_sec = rusage.ru_stime.tv_sec;
+ tv->stime.tv_usec = rusage.ru_stime.tv_usec;
+ #else
+ usec = get_run_time ();
+ tv->utime.tv_sec = usec/1000000;
+ tv->utime.tv_usec = usec - 1000000*tv->utime.tv_sec;
+ tv->stime.tv_sec = 0;
+ tv->stime.tv_usec = 0;
+ #endif
+ }
+
+ static void
+ print_diff_now (struct mi_timestamp *start)
+ {
+ struct mi_timestamp now;
+ timestamp (&now);
+ print_diff (start, &now);
+ }
+
+ static long
+ timeval_diff (struct timeval start, struct timeval end)
+ {
+ return ((end.tv_sec - start.tv_sec) * 1000000)
+ + (end.tv_usec - start.tv_usec);
+ }
+
+ static void
+ print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
+ {
+ fprintf_unfiltered
+ (raw_stdout,
+ ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
+ timeval_diff (start->wallclock, end->wallclock) / 1000000.0,
+ timeval_diff (start->utime, end->utime) / 1000000.0,
+ timeval_diff (start->stime, end->stime) / 1000000.0);
+ }