RFR: 8231666: ThreadIdTable::grow() invokes invalid thread transition
David Holmes
david.holmes at oracle.com
Wed Oct 2 06:46:00 UTC 2019
Hi Daniil,
On 2/10/2019 4:13 pm, Daniil Titov wrote:
> Please review a change that fixes the issue. The problem here is that that the thread is added to the ThreadIdTable (introduced in [3]) while the Threads_lock is held by
> JVM_StartThread. When new thread is added to the thread table the table checks if its load factor is greater than required and if so it grows itself while polling for safepoints.
> After changes [4] an attempt to block the thread while holding the Threads_lock results in assertion in Thread::check_possible_safepoint().
>
> The fix proposed by David Holmes ( thank you, David!) is to skip the ThreadBlockInVM inside ThreadIdTable::grow() method if the current thread owns the Threads_lock.
Sorry but looking at the fix in context now I think it would be better
to do this:
while (gt.do_task(jt)) {
if (Threads_lock->owner() == jt) {
gt.pause(jt);
ThreadBlockInVM tbivm(jt);
gt.cont(jt);
}
}
This way we don't waste time with the pause/cont when there's no
safepoint pause going to happen - and the owner() check is quicker than
owned_by_self(). That partially addresses a general concern I have about
how long it may take to grow the table, as we are deferring safepoints
until it is complete in this JVM_StartThread usecase.
In the test you don't need all of:
32 * @run clean ThreadStartTest
33 * @run build ThreadStartTest
34 * @run main ThreadStartTest
just the last @run suffices to build and run the test.
Thanks,
David
-----
> Testing : Mach 5 tier1 and tier2 completed successfully, tier3 is in progress.
>
> [1] Webrev: http://cr.openjdk.java.net/~dtitov/8231666/webrev.01/
> [2] Bug: https://bugs.openjdk.java.net/browse/JDK-8231666
> [3] https://bugs.openjdk.java.net/browse/JDK-8185005
> [4] https://bugs.openjdk.java.net/browse/JDK-8184732
>
> Best regards,
> Danill
>
>
More information about the serviceability-dev
mailing list