# HG changeset patch # User dbuck # Date 1396766304 25200 # Node ID 5cf196cc540570c2b5bcfe9860eab182c024cf2b # Parent eb82175e7fbb63f3e5bf3ab655c519a69a552886 8026334: hs_err improvement: Print elapsed time in a humanly readable format Reviewed-by: coleenp, dsamersoff Contributed-by: masato.yoshida@oracle.com diff -r eb82175e7fbb -r 5cf196cc5405 src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Fri Apr 04 09:54:56 2014 -0700 +++ b/src/share/vm/runtime/os.cpp Sat Apr 05 23:38:24 2014 -0700 @@ -929,6 +929,10 @@ } void os::print_date_and_time(outputStream *st) { + const int secs_per_day = 86400; + const int secs_per_hour = 3600; + const int secs_per_min = 60; + time_t tloc; (void)time(&tloc); st->print("time: %s", ctime(&tloc)); // ctime adds newline. @@ -937,7 +941,17 @@ // NOTE: It tends to crash after a SEGV if we want to printf("%f",...) in // Linux. Must be a bug in glibc ? Workaround is to round "t" to int // before printf. We lost some precision, but who cares? - st->print_cr("elapsed time: %d seconds", (int)t); + int eltime = (int)t; // elapsed time in seconds + + // print elapsed time in a human-readable format: + int eldays = eltime / secs_per_day; + int day_secs = eldays * secs_per_day; + int elhours = (eltime - day_secs) / secs_per_hour; + int hour_secs = elhours * secs_per_hour; + int elmins = (eltime - day_secs - hour_secs) / secs_per_min; + int minute_secs = elmins * secs_per_min; + int elsecs = (eltime - day_secs - hour_secs - minute_secs); + st->print_cr("elapsed time: %d seconds (%dd %dh %dm %ds)", eltime, eldays, elhours, elmins, elsecs); } // moved from debug.cpp (used to be find()) but still called from there