RFR (M): 8168467: Use TaskEntry as task mark queue elements

Thomas Schatzl thomas.schatzl at oracle.com
Tue Mar 7 16:35:41 UTC 2017


Hi Kim,

  sorry for the delay...

On Sat, 2017-02-25 at 14:06 -0500, Kim Barrett wrote:
> > 
> > On Feb 23, 2017, at 6:02 AM, Thomas Schatzl <thomas.schatzl at oracle.
> > com> wrote:
> > 
> > Hi all,
> > 
> >   can I have reviews for this cleanup that changes the oop-misuse
> > for
> > marking (setting LSB to 1 for array slices) into adding a
> > proper G1TaskQueueEntry that hides that mess a little?
> > 
> > CR:
> > https://bugs.openjdk.java.net/browse/JDK-8168467
> > Webrev:
> > http://cr.openjdk.java.net/~tschatzl/8168467/webrev/
> > Testing:
> > jprt, tier2+3 gc tests
> > 
> > Thanks,
> >   Thomas
> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>   77     return (HeapWord*)((uintptr_t)_holder &~ ArraySliceBit);
> 
> "&~ ArraySliceBit" => "& ~ArraySliceBit"

Fixed.

> 
> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>   42 #ifdef _MSC_VER
>   43 #pragma warning(push)
>   44 // warning C4522: multiple assignment operators specified
>   45 #pragma warning(disable:4522)
>   46 #endif
> 
> Is the non-volatile overload of operator= needed?

Yes, it is part of the API for the task queues.

> Or can the need for an assignment operator be eliminated?  That is,
> replace one or both with a named function, say "assign(...)".

What is the reason for this suggestion? Having two assignment
operators, one for volatile and other for non-volatile instances does
not seem to be really problematic. When I tried this the code doing the
assignments became more unnatural looking.

This seems to be more a case of the compiler being over-cautious than a
real problem.

I kept this for now.

> Note also that copy-assign w/o copy-construct is often considered a
> bad smell.

I added that one, although it is the same as the default one.

> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>   57   G1TaskQueueEntry(oop obj) : _holder(obj) { }
>   58   G1TaskQueueEntry(HeapWord* addr) :
> _holder((void*)((uintptr_t)addr | ArraySliceBit)) { }
> 
> Should these really be implicit conversions?

I think I fixed this by using factory methods and hidden constructors.

> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>   57   G1TaskQueueEntry(oop obj) : _holder(obj) { }
> 
> From usage elsewhere, I suspect obj must not be NULL.  If true, an
> assert would be good.

Fixed.

> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>  273   // Pushes the given buffer containing at most OopsPerChunk
> elements on the mark
> 
> OopsPerChunk is renamed.  There are other occurrences.

I did a lot of renaming in addition to that.

> 
> -------------------------------------------------------------------
> ----------- 
> src/share/vm/gc/g1/g1ConcurrentMark.hpp 
>  278   bool par_push_chunk(G1TaskQueueEntry* buffer);
>  283   bool par_pop_chunk(G1TaskQueueEntry* buffer);
> 
> Pre-existing: I think the API might be cleaner if these took OopChunk
> arguments, rather than entry pointers.

I would prefer if that were done as part of JDK-8162952 because it
seems an obvious change to do in that context.

> -------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.cpp
> 2011   void operator()(G1TaskQueueEntry task_entry) const {
> 2012     guarantee(task_entry.is_array_slice() || task_entry.obj()-
> >is_oop(),
> ...
> 2015     guarantee(task_entry.is_array_slice() || !_g1h-
> >is_in_cset(task_entry.obj()),
> 
> Since these are guarantees, I think it would be more readable to
> hoist
> the is_array_slice check.

Fixed.

> 
> --------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMark.cpp
> 2467     G1TaskQueueEntry obj;
> ...
> 2470       scan_object(obj);
> 
> Shouldn't "obj" be "entry".  And scan_object seems misnamed.

Fixed. Also renamed other methods with "obj" getting entries.

> 
> ------------------------------------------------------------------
> src/share/vm/gc/g1/g1ConcurrentMarkObjArrayProcessor.hpp
>   53   // Process the given continuation "oop". Returns the number of
> words scanned.
>   54   size_t process_slice(HeapWord* slice);
> 
> Comment needs updating.

Fixed.

New webrev:
http://cr.openjdk.java.net/~tschatzl/8168467/webrev.0_to_1/ (incrementa
l)
http://cr.openjdk.java.net/~tschatzl/8168467/webrev.1/ (full)

Thanks,
  Thomas



More information about the hotspot-gc-dev mailing list