CRR (M): 7157073: G1: type change size_t -> uint for region counts / indexes
Jon Masamitsu
jon.masamitsu at oracle.com
Tue Apr 3 02:14:33 UTC 2012
Sorry about the late response. I didn't see this when I looked earlier.
Responses in-line
On 4/2/2012 8:03 AM, Tony Printezis wrote:
> Hi Jon,
>
> Thanks for looking at this. Inline.
>
> On 03/28/2012 12:11 AM, Jon Masamitsu wrote:
>> Tony,
>>
>> Looks good. A few questions.
>>
>> http://cr.openjdk.java.net/~tonyp/7157073/webrev.0/webrev.1.G1Uints/src/share/vm/gc_implementation/g1/concurrentMark.cpp.frames.html
>>
>>
>>> 1841 BitMap::idx_t index = (BitMap::idx_t) hr->hrs_index();
>>> 1842 if (!hr->startsHumongous()) {
>>> 1843 // Normal (non-humongous) case: just set the bit.
>>> 1844 _region_bm->par_set_bit(index);
>>> 1845 } else {
>>> 1846 // Starts humongous case: calculate how many regions are
>>> part of
>>> 1847 // this humongous region and then set the bit range.
>>> 1848 G1CollectedHeap* g1h = G1CollectedHeap::heap();
>>> 1849 HeapRegion *last_hr =
>>> g1h->heap_region_containing_raw(hr->end() - 1);
>>> 1850 size_t end_index = (BitMap::idx_t) last_hr->hrs_index() + 1;
>>> 1851 _region_bm->par_at_put_range(index, end_index, true);
>>
>> Why the choice to make index (line 1841) a BitMap::idx_t and
>> end_index (line 1850) a size_t? Seems like
>> end_index could also be BitMap::idx_t.
>
> Thanks for spotting this, it looks as if I just forgot to change the
> type of end_index (there was a similar change earlier on where I
> seemed to have done the right thing). Fixed.
Thanks.
>
>>> 1709 gclog_or_tty->print_cr("Region %u: card bitmap
>>> mismatch at " SIZE_FORMAT ": "
>>> 1710 "expected: %d, actual: %d",
>>> 1711 hr->hrs_index(), i, expected,
>>> actual);
>>
>> Since you changed the format for hr->hrs_index() to %u, maybe change
>> the other format
>> to $u also?
>
> Which "other" format?
>
> i is of type BitMap::idx_t (which is basically size_t), so SIZE_FORMAT
> is appropriate for it
> expected and actual are bool's
Sorry about the fuzzy comment. The different types of indexes confused me.
You changed the format for one type of index to %u and I thought the other
type of indexes would also be %u but they are different types of indexes so
it's fine as is. What you have below is fine also.
>
> Does the following work better?
>
> gclog_or_tty->print_cr("Region %u: card bitmap mismatch at "
> SIZE_FORMAT ": "
> "expected: %s, actual: %s",
> hr->hrs_index(), i,
> BOOL_TO_STR(expected),
> BOOL_TO_STR(actual));
>
> and I also changed an earlier similar message to the following too:
>
> gclog_or_tty->print_cr("Region %u: region bitmap mismatch: "
> "expected: %s, actual: %s",
> hr->hrs_index(),
> BOOL_TO_STR(expected),
> BOOL_TO_STR(actual));
>
>
>> http://cr.openjdk.java.net/~tonyp/7157073/webrev.0/webrev.1.G1Uints/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp.frames.html
>>
>>
>>> 2042 const uint max_region_idx = ((uint)1<<
>>> (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
>> You might have been able to use 1U instead of (uint) 1.
>
> I *think* I've seen it both ways in the code and I don't have a strong
> preference. I'll go with 1U.
Thanks. Yes, I've seen it both ways too. 1U seems a little nicer.
>
>>> 2078 HeapRegionRemSet::init_heap((size_t) max_regions());
>>
>> I would have changed the parameter to init_heap() to uint. Only one
>> call site.
>
> init_heap() will go away when we replace the RSet code, so I'll leave
> it as is for the moment.
OK.
>
>> http://cr.openjdk.java.net/~tonyp/7157073/webrev.0/webrev.1.G1Uints/src/share/vm/gc_implementation/g1/sparsePRT.cpp.udiff.html
>>
>>
>>> - gclog_or_tty->print_cr(" Adding card %d from region %d to region "
>>> - SIZE_FORMAT" sparse.",
>>> + gclog_or_tty->print_cr(" Adding card %d from region %d to region
>>> %u sparse.",
>>> card_index, region_id, _hr->hrs_index());
>>
>> Why stay with the %d format? Same thing here
>>
>>
>>> - gclog_or_tty->print_cr(" Expanded sparse table for "SIZE_FORMAT"
>>> to %d.",
>>> + gclog_or_tty->print_cr(" Expanded sparse table for %u to %d.",
>>> _hr->hrs_index(), _next->capacity());
>
> SparsePRT is part of the RSet structures and will go away when the
> RSets are replaced (in fact, that whole file should go away). So, I
> didn't want to spend too much time on that... I'll leave it as is if
> that's OK.
Ok.
Jon
>
> Tony
>
>> That's all.
>>
>> Jon
>>
>> On 3/27/2012 9:34 AM, Tony Printezis wrote:
>>> Hi all,
>>>
>>> I'd like a couple of reviews for this cleanup. We have been using
>>> size_t's to represent region counts / indexes and I have been
>>> encouraged to change those to uint's. This unfortunately turned out
>>> to be quite an extensive change that was hard to localize. I've
>>> split the change into two webrevs.
>>>
>>> First, this breaks down a long line in g1CollectedHeap.cpp. I I have
>>> it on a separate webrev as it messes up the webrev pages for the
>>> rest of the changes (i.e., the rest of the changes are easier to
>>> read with this excluded):
>>>
>>> http://cr.openjdk.java.net/~tonyp/7157073/webrev.0/webrev.0.G1LongLineFix/
>>>
>>>
>>> The main body of the changes is here:
>>>
>>> http://cr.openjdk.java.net/~tonyp/7157073/webrev.0/webrev.1.G1Uints/
>>>
>>> Some important comments:
>>>
>>> * I tried to change as many of the size_t occurrences as possible
>>> but I didn't touch the following:
>>>
>>> - HeapRegionRemSet - we're in the process of reworking this code so
>>> I decided to leave it mostly as is (I only added a few necessary casts)
>>>
>>> - CollectionSetChooser / HeapRegion::sort_index() /
>>> HeapRegion::_sort_index - I have a CR open for a CSetChooser cleanup
>>> and I'll do the conversion as part of that cleanup (I did change a
>>> few types on the CSetChooser external API to avoid casts from
>>> methods that access it).
>>>
>>> - HeapRegion::_young_index_in_cset /
>>> HeapRegion::young_index_in_cset() - The code looks as if it relies
>>> on the fact that this is an int. It seems well localized so I left
>>> it as is and we can look at it on a separate CR.
>>>
>>> * I had to make some changes to the vmStructs_g1.hpp and I need to
>>> ensure that the SA code works with those changes. Unfortunately, I'm
>>> going on vacation for a few days tonight and I haven't had a chance
>>> to do that yet. I'll look at the SA more closely when I get back
>>> and, if I need to make any changes to the SA, I'll publish those
>>> separately (they will be self-contained anyway). I just wanted to
>>> get the main body of the changes out before I leave so any potential
>>> reviewers can get started on it.
>>>
>>> * Testing: the source builds on all platforms and passes JPRT. And I
>>> did a lot of extra 64-bit testing (as any issues should mainly show
>>> up in 64-bit builds).
>>>
>>> Tony
>>>
More information about the hotspot-gc-dev
mailing list