RFR: Remove unused base_obj handling from closures and concurrent mark code

Roman Kennke rkennke at redhat.com
Fri Aug 31 16:41:50 UTC 2018


Yes, looks good. Thank you!
Roman

> http://cr.openjdk.java.net/~shade/shenandoah/traversal-baseobj/webrev.01/
> 
> While reading the traversal closures code, I realized this block does nothing useful for
> !is_in_reserved path:
> 
>   66     if (UPDATE_MATRIX && update_matrix) {
>   67       shenandoah_assert_not_forwarded_except(p, obj, _heap->cancelled_gc());
>   68       const void* src;
>   69       if (!_heap->is_in_reserved(p)) {
>   70         src = (const void*)(HeapWord*) obj;
>   71       } else {
>   72         src = p;
>   73       }
>   74       if (src != NULL) {
>   75         _matrix->set_connected(src, obj);
>   76       }
>   77     }
> 
> Roman said offline that it was supposed to handle the corner case where two objects are connected
> through off-heap reference. But that requires replacing "src = obj" with "src = base_obj". In
> current form, the code just connects obj->obj, which is safe, but both futile and unnecessary.
> 
> It looks like that corner case is already handled gracefully by treating off-heap locations as
> roots. And this code does nothing for that case anyway, yet the tests are fine. So, I propose to
> remove the handling for base_obj from the code. This both simplifies the closures, and also removes
> the set_base_obj handling from the hot path in concurrent marking.
> 
> Moving the matrix block downwards also allows to subsume assertion check.
> 
> Testing: tier3_gc_shenandoah
> 
> Thanks,
> -Aleksey
> 




More information about the shenandoah-dev mailing list