RFR: JDK-8138707, 8138862, 8138863: TestPromotionEventWithParallelScavenge.java crashes using undefined GC id.

Bengt Rutisson bengt.rutisson at oracle.com
Mon Oct 5 09:44:16 UTC 2015


Hi everyone,

I'd like to ask for a couple of reviews for these three changes. I chose 
to put all three webrevs in a single review email since they are closely 
related.

Originally I just wanted to address JDK-8138707 which is caused by a 
recent change I made that stores the current GC id in the working 
thread. In that fix I missed adding the GC id to the ParallelGC worker 
threads. The fix for that is pretty simple, we can do it the same way 
that it is done for AbstractGangTask and similar. That is, store the 
current GC id in the task and then let the worker thread pick the GC id 
up from the task when it starts executing a task.

When I did that simple fix I realized that there are some tweaks in the 
ParallelGC version of the task system that made this a bit tricky. There 
is a NoopTask that is a singleton and thus gets set up before we have an 
reasonable GC id to use. That is not such a big problem since a NoopTask 
will not do any work for a GC (by definition) and therefore does not 
need to log or send events using a GC id.

A more problematic thing is that there is a WaitForBarrierGCTask that is 
used by the worker threads when they are idle and need to wait for work 
to appear. They actually use an IdleTask for waiting. This task is 
created "normally" and can access the gc_id field in the worker thread. 
But the IdleTasks all use a singleton WaitForBarrierGCTask for 
notification purposes. However, they actually don't use it as a task. 
They just use it as a convenient wrapper for a monitor. But the 
singleton setup of a WaitForBarrierGCTask is a problem since there is no 
GC id to use at the initialization time.

In GCTaskManager::execute_and_wait() the WaitForBarrierGCTask is used as 
a normal GCTask and is created in a way that allows the GC id to be set 
properly.

To avoid having to handle two different use cases for 
WaitForBarrierGCTask I factored out the monotor support into a 
WaitHelper class. That can be used without GC id issues by the IdleTasks 
and the WaitForBarrierGCTask can simply aggregate such a helper.

While trying to understand all this I stumbled over some unused code. 
So, I ended up splitting this work up into three changesets:

JDK-8138862: Remove some unused code and subclasses in gcTaskManager.hpp/cpp
https://bugs.openjdk.java.net/browse/JDK-8138862
http://cr.openjdk.java.net/~brutisso/8138862/webrev.00/

JDK-8138863: Refactor WaitForBarrierGCTask
https://bugs.openjdk.java.net/browse/JDK-8138863
http://cr.openjdk.java.net/~brutisso/8138863/webrev.00/

JDK-8138707: TestPromotionEventWithParallelScavenge.java crashes using 
undefined GC id.
https://bugs.openjdk.java.net/browse/JDK-8138707
http://cr.openjdk.java.net/~brutisso/8138707/webrev.00/

There are some descriptions in the JBS issues about what I did. Here are 
a few more details:

JDK-8138862: Remove some unused code and subclasses in gcTaskManager.hpp/cpp
- Since I removed the BarrierGCTask I renamed the "kind" from 
barrier_task to wait_for_barrier_task.
- The NotifyDoneClosure was only set up in the GCTaskManager::create(int 
workers, NotifyDoneClosure* ndc) method, but this was never used. So 
effectively the _ndc field of GCTaskManager was always NULL.
- By removing BarrierGCTask there was no longer a need for 
WaitForBarrierGCTask::do_it_internal() since all the work can be done in 
the do_it() method.
- I'm sure there is more dead and unused cde in gcTaskManager.hpp/cpp. I 
removed the code that was obscuring things for the changes that I needed 
to do. There may well be more code that can be deleted and cleaned up later.

JDK-8138863: Refactor WaitForBarrierGCTask
- By splitting out the WaitHelper parts from WaitForBarrierGCTask there 
is no longer anyone setting it up as a C-heap object. Thus, that factory 
method and the instance state could be removed.

JDK-8138707: TestPromotionEventWithParallelScavenge.java crashes using 
undefined GC id.
- The fix here is very similar to what is done in for example 
AbstractGangTask and the GangWorkers. See:
http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/d9d44c9d7bf0/src/share/vm/gc/shared/workgroup.hpp#l56
http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/d9d44c9d7bf0/src/share/vm/gc/shared/workgroup.cpp#l329


Thanks,
Bengt





More information about the hotspot-gc-dev mailing list