< prev index next >
src/hotspot/share/gc/cms/cmsCardTable.cpp
Print this page
*** 21,30 ****
--- 21,31 ----
* questions.
*
*/
#include "precompiled.hpp"
+ #include "gc/cms/cmsCardTable.hpp"
#include "gc/cms/cmsHeap.hpp"
#include "gc/shared/cardTableBarrierSet.hpp"
#include "gc/shared/cardTableRS.hpp"
#include "gc/shared/collectedHeap.hpp"
#include "gc/shared/space.inline.hpp"
*** 34,44 ****
#include "runtime/java.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/vmThread.hpp"
! void CardTableRS::
non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr,
OopsInGenClosure* cl,
CardTableRS* ct,
uint n_threads) {
assert(n_threads > 0, "expected n_threads > 0");
--- 35,62 ----
#include "runtime/java.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/vmThread.hpp"
! CMSCardTable::CMSCardTable(MemRegion whole_heap) :
! CardTableRS(whole_heap, CMSPrecleaningEnabled /* scanned_concurrently */) {
! }
!
! // Returns the number of chunks necessary to cover "mr".
! size_t CMSCardTable::chunks_to_cover(MemRegion mr) {
! return (size_t)(addr_to_chunk_index(mr.last()) -
! addr_to_chunk_index(mr.start()) + 1);
! }
!
! // Returns the index of the chunk in a stride which
! // covers the given address.
! uintptr_t CMSCardTable::addr_to_chunk_index(const void* addr) {
! uintptr_t card = (uintptr_t) byte_for(addr);
! return card / ParGCCardsPerStrideChunk;
! }
!
! void CMSCardTable::
non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr,
OopsInGenClosure* cl,
CardTableRS* ct,
uint n_threads) {
assert(n_threads > 0, "expected n_threads > 0");
*** 80,90 ****
}
}
}
void
! CardTableRS::
process_stride(Space* sp,
MemRegion used,
jint stride, int n_strides,
OopsInGenClosure* cl,
CardTableRS* ct,
--- 98,108 ----
}
}
}
void
! CMSCardTable::
process_stride(Space* sp,
MemRegion used,
jint stride, int n_strides,
OopsInGenClosure* cl,
CardTableRS* ct,
*** 160,170 ****
chunk_card_start += ParGCCardsPerStrideChunk * n_strides;
}
}
void
! CardTableRS::
process_chunk_boundaries(Space* sp,
DirtyCardToOopClosure* dcto_cl,
MemRegion chunk_mr,
MemRegion used,
jbyte** lowest_non_clean,
--- 178,188 ----
chunk_card_start += ParGCCardsPerStrideChunk * n_strides;
}
}
void
! CMSCardTable::
process_chunk_boundaries(Space* sp,
DirtyCardToOopClosure* dcto_cl,
MemRegion chunk_mr,
MemRegion used,
jbyte** lowest_non_clean,
*** 369,379 ****
dcto_cl->set_last_bottom(max_to_do);
#endif
}
void
! CardTableRS::
get_LNC_array_for_space(Space* sp,
jbyte**& lowest_non_clean,
uintptr_t& lowest_non_clean_base_chunk_index,
size_t& lowest_non_clean_chunk_size) {
--- 387,397 ----
dcto_cl->set_last_bottom(max_to_do);
#endif
}
void
! CMSCardTable::
get_LNC_array_for_space(Space* sp,
jbyte**& lowest_non_clean,
uintptr_t& lowest_non_clean_base_chunk_index,
size_t& lowest_non_clean_chunk_size) {
*** 428,432 ****
--- 446,473 ----
// In any case, now do the initialization.
lowest_non_clean = _lowest_non_clean[i];
lowest_non_clean_base_chunk_index = _lowest_non_clean_base_chunk_index[i];
lowest_non_clean_chunk_size = _lowest_non_clean_chunk_size[i];
}
+
+ #ifdef ASSERT
+ void CMSCardTable::verify_used_region_at_save_marks(Space* sp) const {
+ MemRegion ur = sp->used_region();
+ MemRegion urasm = sp->used_region_at_save_marks();
+
+ if (!ur.contains(urasm)) {
+ log_warning(gc)("CMS+ParNew: Did you forget to call save_marks()? "
+ "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in "
+ "[" PTR_FORMAT ", " PTR_FORMAT ")",
+ p2i(urasm.start()), p2i(urasm.end()), p2i(ur.start()), p2i(ur.end()));
+ MemRegion ur2 = sp->used_region();
+ MemRegion urasm2 = sp->used_region_at_save_marks();
+ if (!ur.equals(ur2)) {
+ log_warning(gc)("CMS+ParNew: Flickering used_region()!!");
+ }
+ if (!urasm.equals(urasm2)) {
+ log_warning(gc)("CMS+ParNew: Flickering used_region_at_save_marks()!!");
+ }
+ ShouldNotReachHere();
+ }
+ }
+ #endif // ASSERT
< prev index next >