Hi Yasumasa,

On 29/08/2019 12:14 am, Yasumasa Suenaga wrote:
Hi,

I guess this issue was occurred on ObjectFree JVMTI event.
It is registered in a04t001.cpp [1]. I think it might be called on GC worker because it relates to JvmtiExport::weak_oops_do().

In current code, JvmtiRawMonitor::_owner is handled with atomic operation.
However at JvmtiRawMonitor::quick_enter() in new webrev, it just referent normally.
Should it be handled atomically?

No. In the new code "_owner" is only an informational field used by the current thread to detect its own recursive lock usage. Actual ownership is determined by the successful lock or tryLock of the underlying PlatformMonitor.

However I had been thinking about memory ordering and there are missing membars. We have to do:

lock(); _owner=THREAD;
_owner=NULL; unlock();

in the order specified so I need to insert storestore barriers.


At least, I think this assert might be failed in current code because raw monitor might be handled on GC worker. So "FIXME" comment Martin found is valid...

Yes. Though I'd still like to understand why we don't see the same assertion failure in existing code.

But moving on ... what are your thoughts on the interrupt semantics?

Thanks,
David



Thanks,

Yasumasa


[1] hg.openjdk.java.net/jdk/jdk/file/4f38fcd65577/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP04/ap04t001/ap04t001.cpp#l219


On 2019/08/28 21:57, Doerr, Martin wrote:
Hi David,

Now why would a GCTaskThread being executing code that accesses
JvmtiRawMonitors? Are we in some kind of event callback?
I believe so. The test registers the following callbacks:
     callbacks.GarbageCollectionStart = &GarbageCollectionStart;
     callbacks.GarbageCollectionFinish = &GarbageCollectionFinish;
And these callback functions use jvmti->RawMonitorEnter.

Note that the spec for "Raw Monitor Enter" allows this:
"This function may be called from the callbacks to the Heap iteration functions, or from the event handlers for the GarbageCollectionStart, GarbageCollectionFinish, and ObjectFree events."

Is there any more stack? What is that dll?
The dll belongs to the test. I guess it was built without debug info so there's no native stack trace available.

Can you tell me what test this was and how to reproduce?
make run-test TEST="vmTestbase/nsk/jvmti/scenarios/allocation/AP04/ap04t001"
I haven't tried if it can be reproduced well. May be sporadic.

At least, I can confirm that the following comment is true 😊
// FIXME: this is broken - raw_enter only accepts the VMThread

Best regards,
Martin

Reply via email to