RFR: 8150676: Use BufferNode index

Kim Barrett kim.barrett at oracle.com
Wed Mar 2 22:49:24 UTC 2016

> On Mar 2, 2016, at 3:09 PM, Jon Masamitsu <jon.masamitsu at oracle.com> wrote:


Thanks for looking at this.

> http://cr.openjdk.java.net/~kbarrett/8150676/webrev.00/src/share/vm/gc/g1/dirtyCardQueue.hpp.frames.html
>   55   // Apply the closure to all active elements, from index to size.  If
> Change "size" to "_sz"?  It's hard to understand what "size" is from only the
> signature of apply_closure().  Using "_sz" gives a (weak) hint that the upper limit
> is a field in the class.

Same applies to index vs. _index. But size is at least an accessor
function.  And while I dislike mentioning internals in a "doc"
comment, avoiding it here is probably harder than is useful.  So
I'm updating the comment for both.

>   69   static bool apply_closure_to_buffer(CardTableEntryClosure* cl,
> Would "apply_closure_to_node" now be a better name?

Not necessarily; the closure is to be applied to the node's buffer. [I
also have some more cleanups in development; I'm not sure this
function will survive in its current form.]

> http://cr.openjdk.java.net/~kbarrett/8150676/webrev.00/src/share/vm/gc/g1/satbMarkQueue.cpp.frames.html
>>  129     if (retain_entry(entry, g1h)) {
>>  130       // Found keeper.  Search high to low for an entry to discard.
>>  131       while ((src < --dst) && retain_entry(*dst, g1h)) { }
>>  132       if (src >= dst) break;    // Done if no discard found.
> If I'm at line 132 then "src" points to a keeper and is the lowest
> (addressed) keeper.  If that's true, then if "dst" is less than "src"
> as seems to be allowed at line 132, then the index calculation
>>  137   _index = pointer_delta(dst, buf, 1);
> seems like it will be off (too small).

Recall that line 136 asserts (src == dst). Line 132 could equally well
be "if (src == dst) break;" followed by asserting (src < dst), but I'm
slightly less confident (or probably overly pessimistic) the compiler
would optimize that away.

As written state (dst < src) is not possible anywhere in this
algorithm, assuming the initial (_index <= _sz) invariant holds.

I tried several ways of writing this, including the addition of state
variables or using goto(!) (loop nests can be such a pain); what I
published seemed like the easiest to understand (for me, today, but I
might be too close to this code right now). I can provide some of
those alternatives for discussion if you wish.

One thing that makes it tricky is the aforesaid line 136 assertion,
which I found very helpful, but which requires some additional code
(such as line 132) to make it work. That is, this suffices,

  for ( ; src < dst; ++src) {
    if (retain_entry(entry, g1h)) {
      while (src < --dst) {
        if (!retain_entry(*dst, g1h)) {
          *dst = entry;
  _index = pointer_delta(dst, buf, 1);

but I find it less convincing without the final assert, which doesn't
hold with this version.

> http://cr.openjdk.java.net/~kbarrett/8150676/webrev.00/src/share/vm/gc/g1/ptrQueue.cpp.frames.html
>  209       BufferNode* node = BufferNode::make_node_from_buffer(_buf, _index);
> Move 209 above 190
>  190     if (_lock) {
> and delete 222?
>  222       BufferNode* node = BufferNode::make_node_from_buffer(_buf, _index);

I have another change in development that refactors things so that
this code movement would need to be undone.

More information about the hotspot-gc-dev mailing list