RFR (S) 8205608: Fix 'frames()' in ThreadReferenceImpl.c to prevent quadratic runtime behavior
Chris Plummer
chris.plummer at oracle.com
Fri Jul 20 20:12:51 UTC 2018
Oops. Sorry, that testing comment was for another changeset. I didn't
test your changes. If you think they could use some additional testing
on some more platforms, let me know.
thanks,
Chris
On 7/20/18 1:07 PM, Chris Plummer wrote:
> Hi Ralf,
>
> Changes look good and pass all the testing I did. You can push once
> Serguei approves.
>
> thanks,
>
> Chris
>
> On 7/20/18 7:28 AM, Schmelter, Ralf wrote:
>> Hi Sergue,
>>
>> I’ve updated the webref:
>> http://cr.openjdk.java.net/~simonis/webrevs/2018/8205608.v4/
>>
>> JVMTI_ERROR_OPAQUE_FRAME was never returned from GetFrameLocation().
>> If it would have, the old code would have removed all native methods
>> from the call stack. The original JVMDI call did indeed return
>> JVMDI_ERROR_OPAQUE_FRAME, so maybe it was a leftover from the
>> JVMDI->JVMTI transition.
>>
>> I’ve tried to make the test more readable and added some comments to
>> explain why it is done the way it is.
>>
>> Best regards,
>> Ralf
>>
>>
>>
>>
>> From: serguei.spitsyn at oracle.com [mailto:serguei.spitsyn at oracle.com]
>> Sent: Mittwoch, 18. Juli 2018 22:57
>> To: Chris Plummer <chris.plummer at oracle.com>; Schmelter, Ralf
>> <ralf.schmelter at sap.com>; serviceability-dev at openjdk.java.net;
>> Stuefe, Thomas <thomas.stuefe at sap.com>
>> Subject: Re: RFR (S) 8205608: Fix 'frames()' in ThreadReferenceImpl.c
>> to prevent quadratic runtime behavior
>>
>> Hi Ralf,
>>
>> The fix itself looks pretty good to me.
>> Some minor comments.
>>
>> The copyright year needs an update.
>> 218 jint count, filledIn;
>>
>> Could you, please, split the declarations above into different
>> lines to follow the local style?
>> Ii is interesting that the original implementation checked the error
>> code returned
>> from the JVMTI GetFrameLocation for being equal to
>> JVMTI_ERROR_OPAQUE_FRAME.
>> However, the GetFrameLocation spec does not list this error code as
>> possible.
>>
>>
>> Some comments about the test.
>> 52 static void callEnded() {
>> 53 System.out.println("SOE occurred as expected");
>> 54 }
>> 55
>> 56 static int call(int depth) {
>> 57 if (depth == 0) {
>> 58 // Should have seen a stack overflow by now.
>> 59 System.out.println("Exited without creating SOE");
>> 60 System.exit(0);
>> 61 }
>> 62
>> 63 try {
>> 64 int newDepth = call(depth - 1);
>> 65
>> 66 if (newDepth == -1_000) {
>> 67 // Pop some frames so there is room on the
>> stack for the
>> 68 // println()
>> 69 callEnded();
>> 70 }
>> 71
>> 72 return newDepth - 1;
>> 73 } catch (StackOverflowError e) {
>> 74 return -1;
>> 75 }
>> 76 }
>> 77 }
>> I'd suggest to rename the methods call() and callEnded() to
>> something like
>> recursiveMethod() and recursionEnd().
>> Also, the manipulations with SOE create a complexity and are
>> confusing.
>> Could it be more simple to let it propagated and then catch in
>> main()?
>> What is the point for all these checks at the lines 104-119?
>> In general, I'm looking for some ways to make it more clear,
>> simple and stable.
>>
>> Thanks,
>> Serguei
>
>
>
More information about the serviceability-dev
mailing list