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

Coleen Phillimore coleen.phillimore at oracle.com
Wed Apr 2 14:31:12 UTC 2014


Looks good to me.  Thanks for making the code humanly readable also :)
Coleen

On 4/2/14 10:27 AM, Kevin Walls wrote:
>
> Hi Dmitry, all,
>
> So we exchanged emails off the list about the accuracy, and are 
> content to keep the ints for the calculations.  They can be 
> re-multiplied to accurately reconstruct the int value of the "elapsed 
> time" that we print, which we did as an exercise.  Any accuracy 
> concerns after the initial cast from double to int, which we already 
> do, don't seem relevant within the expected uptime of most life forms, 
> let alone processes[1].
>
> It is with formatting changes alone that we refresh the webrev:
>
> http://cr.openjdk.java.net/~kevinw/8026334/webrev.01/
>
> Thanks
> Kevin
>
> [1] that's a forward-looking statement, should come with a disclaimer.
>
>
>
> On 02/04/14 08:46, Dmitry Samersoff wrote:
>> 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
>>>>>
>>>>>
>>>>>
>>
>



More information about the hotspot-runtime-dev mailing list