RR(S): 8026334: hs_err improvement: Print elapsed time in a humanly readable format

Dmitry Samersoff dmitry.samersoff at oracle.com
Wed Apr 2 07:46:11 UTC 2014


Kevin,

1. It's better to use double for arithmetics and convert it to int on
printing.


2. we probably can get rid of intermittent variables
   day_secs, hour_secs, minute_secs


3. I would prefer to have constants as all-caps #defines outside of
function definition or (if you or Coleen disagree with it) at least
moved to ll.935 with empty line before and after it.

-Dmitry

On 2014-04-02 00:53, Kevin Walls wrote:
> Thanks Coleen -
> 
> Here's an update, the constants are good, here's an attempt to use
> constants and keep it not too verbose:
> 
> http://cr.openjdk.java.net/~kevinw/8026334/webrev.01/
> 
> Thanks
> Kevin & Masato
> 
> 
> On 26/03/14 23:44, Coleen Phillimore wrote:
>>
>> Can you make these expressions into a variable for the calculations?  IE.
>> 86400 = seconds_in_a_day
>> 3600 = seconds_in_an_hour
>> 60 = seconds_in_a_minute
>>
>> and then have
>> eldays * 86400 be something like day_seconds
>>
>> Thanks - it would be nice if these numbers only appear once each.
>> Coleen
>> On 3/26/14 7:08 PM, Kevin Walls wrote:
>>>
>>> Hi,
>>>
>>> I'd like to get a review of this change:
>>>
>>> It's adding a human-readable breakdown of the elapsed time, which is
>>> currently printed in raw seconds in the hs_err file (it's the last
>>> item printed).
>>>
>>> This is on behalf of Masato Yoshido who has worked on it. Further
>>> details below, including a method that was used for manual testing.
>>>
>>> bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8026334
>>>
>>> webrev:
>>> http://cr.openjdk.java.net/~kevinw/8026334/webrev.00/
>>>
>>> Many thanks,
>>> Kevin
>>> Masato
>>>
>>>
>>> [Change details]
>>>
>>> - Time format will change as follows:
>>>
>>>   (from)
>>>   elapsed time: %d seconds
>>>
>>>   (to)
>>>   elapsed time: %d seconds (%dd %dh %dm %ds)
>>>
>>> - The reason why I leave the original elapsed time format is:
>>>   -- We don’t need to remove the original format. If we remove it, ones
>>>      who want time information in seconds need to calculate from day-,
>>>      hour-, minute- and second-parts.
>>>
>>> - There is no code doing exactly the same thing. Another code to which
>>>   we might be able to apply calculation similar to this conversion is
>>>   the GC log with -XX:+PrintGCTimeStamps. However, the elapsed time
>>>   in GC log is a floating point number, while the time in hs_err log
>>>   is an integer since there is a problem when %f is used in printf
>>>   on Linux platform (See comments in os::print_date_and_time function).
>>>   Therefore, the same code as this cannot simply be share with GC log.
>>>
>>>
>>> [Test]
>>>
>>> (1) Tested only part of code of elapsed time calculation and printing.
>>>
>>> --- test_print_time.cpp ---
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <limits.h>
>>>
>>> void print_date_and_time(double t) {
>>>   int eltime = (int)t;  // elapsed time in seconds
>>>   int eldays, elhours, elminutes, elseconds;  // for printing elapsed
>>> time in a humanly readable format
>>>   eldays = eltime / 86400;
>>>   elhours = (eltime - eldays * 86400) / 3600;
>>>   elminutes = (eltime - eldays * 86400 - elhours * 3600) / 60;
>>>   elseconds = (eltime - eldays * 86400 - elhours * 3600 - elminutes *
>>> 60);
>>>   printf("elapsed time: %d seconds (%dd %dh %dm %ds)", eltime,
>>> eldays, elhours, elminutes, elseconds);
>>>   printf("\n");
>>> }
>>>
>>> int main(int argc, char *argv[]) {
>>>   print_date_and_time((double)86399);
>>>   print_date_and_time((double)86400);
>>>   print_date_and_time((double)86401);
>>>   printf("\n");
>>>
>>>   print_date_and_time((double)86399.999);
>>>   print_date_and_time((double)86400.999);
>>>   print_date_and_time((double)86401.999);
>>>   printf("\n");
>>>
>>>   print_date_and_time((double)(-86399));
>>>   print_date_and_time((double)(-86400));
>>>   print_date_and_time((double)(-86401));
>>>   printf("\n");
>>>
>>>   print_date_and_time((double)INT_MAX);
>>>   print_date_and_time((double)(INT_MAX+1));
>>>   print_date_and_time((double)UINT_MAX);
>>> }
>>> ---
>>>
>>> --- Run the test program
>>> $ ./test_print_time
>>> elapsed time: 86399 seconds (0d 23h 59m 59s)
>>> elapsed time: 86400 seconds (1d 0h 0m 0s)
>>> elapsed time: 86401 seconds (1d 0h 0m 1s)
>>>
>>> elapsed time: 86399 seconds (0d 23h 59m 59s)
>>> elapsed time: 86400 seconds (1d 0h 0m 0s)
>>> elapsed time: 86401 seconds (1d 0h 0m 1s)
>>>
>>> elapsed time: -86399 seconds (0d -23h -59m -59s)
>>> elapsed time: -86400 seconds (-1d 0h 0m 0s)
>>> elapsed time: -86401 seconds (-1d 0h 0m -1s)
>>>
>>> elapsed time: 2147483647 seconds (24855d 3h 14m 7s)
>>> elapsed time: -2147483648 seconds (-24855d -3h -14m -8s)
>>> elapsed time: -2147483648 seconds (-24855d -3h -14m -8s)
>>> ---
>>>
>>>
>>> (2) Tested using a JNI program causing Segmentation Violation.
>>>     Tested on the following platforms:
>>>       solaris sparcv9
>>>       solaris x64
>>>       linux x86
>>>       linux x64
>>>       windows x86
>>>       windows x64
>>>       macosx x64
>>>     hs_err_pid<pid>.log file was successfully generated with expected
>>>     “elapsed time” line on each platform.
>>>
>>>
>>> --- TestCrash.java ---
>>> public class TestCrash {
>>>   static {
>>>     System.loadLibrary("testcrash");
>>>   }
>>>
>>>   public static native void crash();
>>>
>>>   public static void main(String[] args) {
>>>     try {
>>>       Thread.sleep(61000);
>>>     } catch (InterruptedException e) {
>>>       e.printStackTrace();
>>>     }
>>>     crash();
>>>   }
>>> }
>>> ---
>>>
>>> --- TestCrash.c ---
>>> #include <jni.h>
>>>
>>> #ifdef __cplusplus
>>> extern "C" {
>>> #endif
>>> /*
>>>  * Class:     TestCrash
>>>  * Method:    crash
>>>  * Signature: ()V
>>>  */
>>> JNIEXPORT void JNICALL Java_TestCrash_crash(JNIEnv *env, jclass cls) {
>>>   const char *p = "Hello, world!";
>>>   *(char *)p = 'a';
>>> }
>>>
>>> #ifdef __cplusplus
>>> }
>>> #endif
>>> ---
>>>
>>>
>>> Thanks and best regards,
>>> Masato
>>>
>>>
>>>
>>
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.


More information about the hotspot-runtime-dev mailing list