RFR (XS): Fix DerivedPointerTable handling when scanning roots twice in init-evac phase

Roman Kennke rkennke at redhat.com
Tue Mar 7 14:59:15 UTC 2017

Am 07.03.2017 um 12:30 schrieb Aleksey Shipilev:
> On 03/07/2017 11:47 AM, Roman Kennke wrote:
>> With my last fix, we're potentially scanning the roots twice: once for
>> the initial-evacuation+update-refs, and if we run into OOM, another time
>> to update remaining refs. This 2nd scan can cause problems in
>> DerivedPointerTable: it asserts that every root is only visited once.
>> This patch fixes it by enclosing each pass into DerivedPointerTable
>> separately.
>> http://cr.openjdk.java.net/~rkennke/fixdpt/webrev.00/
> I don't get why do you need to duplicate update_pointers() call. Isn't it enough
> to clear the table when concgc was cancelled, and then let the rest run its course?
> if (cancelled_concgc()) {
>   COMPILER2_PRESENT(DerivedPointerTable::clear());
>   ...
> }
> COMPILER2_PRESENT(DerivedPointerTable::update_pointers());

clear() checks that the DPT is not active. If we call clear() without
having called update_pointers() before, we get this assert:

#  Internal Error
pid=1401, tid=1417
#  assert(!_active) failed: should not be active

(If I were to redesign DPT, I would make clear() and update_pointers() a
scoped object...)


More information about the shenandoah-dev mailing list