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

Kevin Walls kevin.walls at oracle.com
Wed Apr 2 14:27:19 UTC 2014


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