# HG changeset patch # User tschatzl # Date 1369128614 -7200 # Node ID 6702da6b6082eb89d7d5ac238e5923beff124c44 # Parent 5ed122fbd0ef2b8c52f465b45686f6d28203e792 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes Summary: Instead of using a simple sizeof(), ask the PerRegionTable class about its size when iterating over the free list. Reviewed-by: jwilhelm, brutisso diff -r 5ed122fbd0ef -r 6702da6b6082 src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp --- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Tue May 21 10:39:09 2013 +0200 +++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Tue May 21 11:30:14 2013 +0200 @@ -242,11 +242,13 @@ PerRegionTable* cur = _free_list; size_t res = 0; while (cur != NULL) { - res += sizeof(PerRegionTable); + res += cur->mem_size(); cur = cur->next(); } return res; } + + static void test_fl_mem_size(); }; PerRegionTable* PerRegionTable::_free_list = NULL; @@ -1149,6 +1151,19 @@ } #ifndef PRODUCT +void PerRegionTable::test_fl_mem_size() { + PerRegionTable* dummy = alloc(NULL); + free(dummy); + guarantee(dummy->mem_size() == fl_mem_size(), "fl_mem_size() does not return the correct element size"); + // try to reset the state + _free_list = NULL; + delete dummy; +} + +void HeapRegionRemSet::test_prt() { + PerRegionTable::test_fl_mem_size(); +} + void HeapRegionRemSet::test() { os::sleep(Thread::current(), (jlong)5000, false); G1CollectedHeap* g1h = G1CollectedHeap::heap(); diff -r 5ed122fbd0ef -r 6702da6b6082 src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp --- a/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Tue May 21 10:39:09 2013 +0200 +++ b/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Tue May 21 11:30:14 2013 +0200 @@ -338,6 +338,7 @@ // Run unit tests. #ifndef PRODUCT + static void test_prt(); static void test(); #endif }; diff -r 5ed122fbd0ef -r 6702da6b6082 src/share/vm/prims/jni.cpp --- a/src/share/vm/prims/jni.cpp Tue May 21 10:39:09 2013 +0200 +++ b/src/share/vm/prims/jni.cpp Tue May 21 11:30:14 2013 +0200 @@ -5015,6 +5015,9 @@ #ifndef PRODUCT #include "gc_interface/collectedHeap.hpp" +#if INCLUDE_ALL_GCS +#include "gc_implementation/g1/heapRegionRemSet.hpp" +#endif #include "utilities/quickSort.hpp" #if INCLUDE_VM_STRUCTS #include "runtime/vmStructs.hpp" @@ -5035,6 +5038,9 @@ #if INCLUDE_VM_STRUCTS run_unit_test(VMStructs::test()); #endif +#if INCLUDE_ALL_GCS + run_unit_test(HeapRegionRemSet::test_prt()); +#endif tty->print_cr("All internal VM tests passed"); } }