Hi Dan, >> * GetOwnedMonitorInfoTest.java >> - I use Thread#yield() to wait until MonitorContendedEnter event is >> fired. > > > Please switch back to a small Thread.sleep(). Thread.yield() > can be a no-op on some platforms which will make the wait > loop very hot.
I fixed it in new webrev: http://cr.openjdk.java.net/~ysuenaga/JDK-8185164/webrev.03/ Thanks, Yasumasa 2017-08-06 23:54 GMT+09:00 Daniel D. Daugherty <daniel.daughe...@oracle.com>: > On 8/6/17 1:28 AM, Yasumasa Suenaga wrote: >> >> Hi Dan, Serguei, >> >> Thanks Serguei! I can run new testcase on my environment. >> >> Dan, I modified your patch and uploaded as webrev: >> >> http://cr.openjdk.java.net/~ysuenaga/JDK-8185164/webrev.02/ >> >> >> * GetOwnedMonitorInfoTest.java >> - I use Thread#yield() to wait until MonitorContendedEnter event is >> fired. > > > Please switch back to a small Thread.sleep(). Thread.yield() > can be a no-op on some platforms which will make the wait > loop very hot. > > >> * libGetOwnedMonitorInfoTest.c >> - I added "volatile" to "status" variable. > > > Sorry I missed that one. > > >> - I moved "event_has_posted = JNI_TRUE" to each before return >> statement. > > > Good catch. My original setting of event_has_posted had > a narrow race. > > I'm good on the changes. I'll have test results later today. > > Dan > > > >> >> >> Yasumasa >> >> >> On 2017/08/06 11:33, Daniel D. Daugherty wrote: >>> >>> Hi Yasumasa and Serguei, >>> >>> I've made some tweaks to the test and attached an updated patch: >>> >>> GetOwnedMonitorInfoTest.java changes: >>> >>> - deleted thread 't2' >>> - made changes to make monitor contention not racy: >>> - added 'hasEventPosted()' native function >>> - changed Main to grab the GetOwnedMonitorInfoTest.class monitor >>> before launching 't1' >>> - added loop to check hasEventPosted() function while holding >>> the GetOwnedMonitorInfoTest.class monitor >>> - moved the delay to this new loop >>> >>> libGetOwnedMonitorInfoTest.c changes: >>> >>> - added event_has_posted flag to know when MonitorContendedEnter >>> event has been posted >>> - added missing error checks to JVM/TI functions >>> - print an error message when MonitorContendedEnter or >>> MonitorContendedEntered gets an incorrect monitor count >>> - print error and warnings to 'stderr' >>> - add Java_GetOwnedMonitorInfoTest_hasEventPosted function >>> >>> I've tested the latest version of test in a repo without the fix >>> and it fails (as expected). Here's some sample output: >>> >>> ----------System.out:(7/231)---------- >>> Agent_OnLoad started >>> Agent_OnLoad finished >>> Main starting worker thread. >>> Main waiting for event. >>> Thread in sync section: Thread-1 >>> MonitorContendedEnter: Thread-1 owns 1 monitor(s) >>> MonitorContendedEntered: Thread-1 owns 1 monitor(s) >>> ----------System.err:(14/931)---------- >>> MonitorContendedEnter: FAIL: monitorCount should be zero. >>> java.lang.RuntimeException: FAILED status returned from the agent >>> at GetOwnedMonitorInfoTest.main(GetOwnedMonitorInfoTest.java:81) >>> at >>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native >>> Method) >>> at >>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>> at >>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.base/java.lang.reflect.Method.invoke(Method.java:564) >>> at >>> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115) >>> at java.base/java.lang.Thread.run(Thread.java:844) >>> >>> JavaTest Message: Test threw exception: java.lang.RuntimeException: >>> FAILED status returned from the agent >>> JavaTest Message: shutting down test >>> >>> >>> Dan >>> >>> >>> On 8/5/17 12:37 PM, serguei.spit...@oracle.com wrote: >>>> >>>> Hi Yasumasa, >>>> >>>> I use the following script to run the test on linux: >>>> >>>> % cat run.sh >>>> #!/bin/sh >>>> REPO=<my_repo> >>>> IMAGES=${REPO}/build/linux-x86_64-normal-server-release/images >>>> export JAVA_HOME=${IMAGES}/jdk >>>> export LD_LIBRARY_PATH=${IMAGES}/test/hotspot/jtreg/native >>>> >>>> jtreg -J-Dtest.java.opts='-server' \ >>>> -jdk ${JAVA_HOME} \ >>>> -nativepath:${LD_LIBRARY_PATH} \ >>>> $REPO/hotspot/test/serviceability/jvmti/GetOwnedMonitorInfo >>>> >>>> >>>> Thanks, >>>> Serguei >>>> >>>> >>>> On 8/5/17 06:31, Yasumasa Suenaga wrote: >>>>> >>>>> Hi Serguei, >>>>> >>>>> I uploaded new webrev: >>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8185164/webrev.01/ >>>>> >>>>> I tried to run serviceability/jvmti/GetOwnedMonitorInfo but it is >>>>> failed because jtreg needs -nativepath option. >>>>> But I didn't know what path should I set to -nativepath. >>>>> >>>>> >>>>> Thanks, >>>>> >>>>> Yasumasa >>>>> >>>>> >>>>> On 2017/08/05 20:20, serguei.spit...@oracle.com wrote: >>>>>> >>>>>> Hi Yasumasa, >>>>>> >>>>>> Please, merge the converted testcase. >>>>>> It still might need more tweaks though. >>>>>> >>>>>> Thanks, >>>>>> Serguei >>>>>> >>>>>> >>>>>> On 8/5/17 03:18, Yasumasa Suenaga wrote: >>>>>>> >>>>>>> Hi Serguei, >>>>>>> >>>>>>> Thank you so much! >>>>>>> Should I merge your testcase? Or can you push this change? >>>>>>> >>>>>>> I agree to your change as a reviewer. >>>>>>> >>>>>>> >>>>>>> Yasumasa >>>>>>> >>>>>>> >>>>>>> On 2017/08/05 11:34, serguei.spit...@oracle.com wrote: >>>>>>>> >>>>>>>> The updated patch attached. >>>>>>>> Now the test is passed with the suggested fix and failed without it. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Serguei >>>>>>>> >>>>>>>> >>>>>>>> On 8/4/17 15:45, serguei.spit...@oracle.com wrote: >>>>>>>>> >>>>>>>>> On 8/4/17 14:26, Daniel D. Daugherty wrote: >>>>>>>>>> >>>>>>>>>> On 8/4/17 3:17 PM, serguei.spit...@oracle.com wrote: >>>>>>>>>>> >>>>>>>>>>> The patch is attached. >>>>>>>>>>> It may need some tweaks though. >>>>>>>>>>> I was not able to make it fail yet. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> I don't think the original test had "failure" detection. >>>>>>>>>> You were just supposed to notice that a pending monitor >>>>>>>>>> was listed under the wrong list. >>>>>>>>> >>>>>>>>> Nothing is listed. >>>>>>>>> Strange thing is I do not see the monitor events fired. >>>>>>>>> I'm using 10 for testing. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Serguei >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Dan >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On 8/4/17 12:45, Daniel D. Daugherty wrote: >>>>>>>>>>>> >>>>>>>>>>>> Thanks Serguei! >>>>>>>>>>>> >>>>>>>>>>>> I happen to be doing a test run this weekend that includes most >>>>>>>>>>>> of the >>>>>>>>>>>> JPDA stack of tests so I'll include the following in my >>>>>>>>>>>> experiment: >>>>>>>>>>>> >>>>>>>>>>>> $ hg log -v -r tip >>>>>>>>>>>> changeset: 12872:bb66cd7c61b1 >>>>>>>>>>>> tag: 8185164.patch >>>>>>>>>>>> tag: qtip >>>>>>>>>>>> tag: tip >>>>>>>>>>>> user: dcubed >>>>>>>>>>>> date: Fri Aug 04 13:41:29 2017 -0600 >>>>>>>>>>>> files: src/share/vm/runtime/objectMonitor.cpp >>>>>>>>>>>> description: >>>>>>>>>>>> imported patch 8185164.patch >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> That will get the product code changes a complete round of >>>>>>>>>>>> testing >>>>>>>>>>>> on Solaris X64 at least... :-) >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Great! >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Serguei >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Dan >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On 8/4/17 1:31 PM, serguei.spit...@oracle.com wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Dan, >>>>>>>>>>>>> >>>>>>>>>>>>> Thank you for letting me know about this discussion. >>>>>>>>>>>>> I'll try to convert the attached test case to the JTreg format. >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks, >>>>>>>>>>>>> Serguei >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On 8/4/17 11:16, Daniel D. Daugherty wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Adding Serguei to this thread directly since he's back from >>>>>>>>>>>>>> vacation! >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 7/31/17 10:14 PM, David Holmes wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Dan, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 26/07/2017 11:52 PM, Daniel D. Daugherty wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 7/26/17 12:11 AM, David Holmes wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 26/07/2017 10:27 AM, Yasumasa Suenaga wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi Dan, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I've added some analysis to the bug report >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thanks! >>>>>>>>>>>>>>>>>> I tried to fix this issue in >>>>>>>>>>>>>>>>>> JvmtiEnvBase::get_owned_monitors() at first. >>>>>>>>>>>>>>>>>> But it is difficult because we cannot know pending monitor >>>>>>>>>>>>>>>>>> if thread state is MONITOR_CONTENDED_ENTER when >>>>>>>>>>>>>>>>>> get_owned_monitor() is >>>>>>>>>>>>>>>>>> called. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I need to look closer at this when I get back from vacation >>>>>>>>>>>>>>>>> next week. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Seems like you're back already. :-) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> A pending monitor should not be reported as owned (unless >>>>>>>>>>>>>>>>> the spec says otherwise) and it seems odd to me to fix the >>>>>>>>>>>>>>>>> current problem >>>>>>>>>>>>>>>>> by marking the monitor as pending earlier. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> It's the updating of the _current_pending_monitor field that >>>>>>>>>>>>>>>> allows JvmtiEnvBase::get_locked_objects_in_frame() to >>>>>>>>>>>>>>>> recognize >>>>>>>>>>>>>>>> that the monitor observed in the frame is only pending and >>>>>>>>>>>>>>>> is not owned. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I put a fairly detailed note in the bug yesterday, but you >>>>>>>>>>>>>>>> should look at that when you're officially back! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks for clarifying things. I also added a comment to the >>>>>>>>>>>>>>> bug report. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I think the fix is sound and prevents anyone from observing >>>>>>>>>>>>>>> the case where the monitor will be seen in the stack-frame, but >>>>>>>>>>>>>>> has not yet >>>>>>>>>>>>>>> been set as the "pending monitor". As far as I can tell it is >>>>>>>>>>>>>>> only this case >>>>>>>>>>>>>>> (GetOwnedMonitorInfo from the contended-monitor event callback >>>>>>>>>>>>>>> in the >>>>>>>>>>>>>>> current thread) that will be able to observe the change. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> One scenario that I worry about here is that a >>>>>>>>>>>>>> GetCurrentContendedMonitor() >>>>>>>>>>>>>> call on a target thread will now be able to return a non-NULL >>>>>>>>>>>>>> value for the >>>>>>>>>>>>>> object, when GetThreadState() will be able to return something >>>>>>>>>>>>>> other than >>>>>>>>>>>>>> blocked (on monitor enter) for the thread. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I don't see anything in the JVM/TI spec that says such a >>>>>>>>>>>>>> scenario is >>>>>>>>>>>>>> wrong; I'm only worried about whether we have any tests that >>>>>>>>>>>>>> would catch >>>>>>>>>>>>>> this slight change in behavior. In any case, one of these >>>>>>>>>>>>>> operations has >>>>>>>>>>>>>> to "happen first": >>>>>>>>>>>>>> >>>>>>>>>>>>>> - thread is marked as blocked >>>>>>>>>>>>>> - monitor is flagged as contended >>>>>>>>>>>>>> >>>>>>>>>>>>>> Currently, they happen in the above order and the fix proposes >>>>>>>>>>>>>> to >>>>>>>>>>>>>> change the order and I see no reason not to do it. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I would like the test attached to the bug to be converted into >>>>>>>>>>>>>> a native >>>>>>>>>>>>>> JTREG test that lives in hotspot/test/serviceability/jvmti. >>>>>>>>>>>>>> See the >>>>>>>>>>>>>> following test as a possible example: >>>>>>>>>>>>>> >>>>>>>>>>>>>> hotspot/test/serviceability/jvmti/GetNamedModule >>>>>>>>>>>>>> >>>>>>>>>>>>>> for how to do this... I haven't done one of these new native >>>>>>>>>>>>>> JTREG >>>>>>>>>>>>>> tests myself, but I believe Serguei has... >>>>>>>>>>>>>> >>>>>>>>>>>>>> Dan >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>> David >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Dan >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>> David >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Did you run the jdk repo's com/sun/jdi tests with your >>>>>>>>>>>>>>>>>>> fix? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I have not done yet. >>>>>>>>>>>>>>>>>> I have a trip until 28 July JST. So I will run it after >>>>>>>>>>>>>>>>>> that. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Yasumasa >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 2017/07/26 7:05, Daniel D. Daugherty wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 7/24/17 8:40 PM, Yasumasa Suenaga wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Hi all, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I tried to get owned monitors in MonitorContendedEnter >>>>>>>>>>>>>>>>>>>> JVMTI event handler. >>>>>>>>>>>>>>>>>>>> However GetOwnedMonitorInfo JVMTI function returns a >>>>>>>>>>>>>>>>>>>> monitor which is >>>>>>>>>>>>>>>>>>>> not yet owned. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I attached reproducer to JBS. Please read README.md. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I think GetOwnedMonitorInfo() should not return a >>>>>>>>>>>>>>>>>>>> pending monitor. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I uploaded webrev. Could you review? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8185164/webrev.00/ >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I hope this fix is applied to 8u or later release. >>>>>>>>>>>>>>>>>>>> I cannot access JPRT. So I need a sponsor. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thanks for the bug report. It's nice to have a test case >>>>>>>>>>>>>>>>>>> and a proposed >>>>>>>>>>>>>>>>>>> fix all in the bug report! I've added some analysis to >>>>>>>>>>>>>>>>>>> the bug report >>>>>>>>>>>>>>>>>>> and we'll need to run this fix through Oracle's JPDA test >>>>>>>>>>>>>>>>>>> stack which >>>>>>>>>>>>>>>>>>> is not (yet) open. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Did you run the jdk repo's com/sun/jdi tests with your >>>>>>>>>>>>>>>>>>> fix? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Dan >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Yasumasa >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>> >>>> >>> >