< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
Print this page
rev 51547 : Refactor to group marking bitmap and TAMS structure in one class ShenandoahMarkingContext
rev 51548 : Avoid indirection to next-mark-context
@@ -207,13 +207,15 @@
class ShenandoahSATBBufferClosure : public SATBBufferClosure {
private:
ShenandoahObjToScanQueue* _queue;
ShenandoahHeap* _heap;
+ ShenandoahMarkingContext* const _mark_context;
public:
ShenandoahSATBBufferClosure(ShenandoahObjToScanQueue* q) :
- _queue(q), _heap(ShenandoahHeap::heap())
+ _queue(q), _heap(ShenandoahHeap::heap()),
+ _mark_context(_heap->next_marking_context())
{
}
void do_buffer(void **buffer, size_t size) {
if (_heap->has_forwarded_objects()) {
@@ -225,22 +227,22 @@
template<UpdateRefsMode UPDATE_REFS>
void do_buffer_impl(void **buffer, size_t size) {
for (size_t i = 0; i < size; ++i) {
oop *p = (oop *) &buffer[i];
- ShenandoahConcurrentMark::mark_through_ref<oop, UPDATE_REFS>(p, _heap, _queue);
+ ShenandoahConcurrentMark::mark_through_ref<oop, UPDATE_REFS>(p, _heap, _queue, _mark_context);
}
}
};
template<class T, UpdateRefsMode UPDATE_REFS>
-inline void ShenandoahConcurrentMark::mark_through_ref(T *p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q) {
- ShenandoahConcurrentMark::mark_through_ref<T, UPDATE_REFS, false /* string dedup */>(p, heap, q);
+inline void ShenandoahConcurrentMark::mark_through_ref(T *p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q, ShenandoahMarkingContext* const mark_context) {
+ ShenandoahConcurrentMark::mark_through_ref<T, UPDATE_REFS, false /* string dedup */>(p, heap, q, mark_context);
}
template<class T, UpdateRefsMode UPDATE_REFS, bool STRING_DEDUP>
-inline void ShenandoahConcurrentMark::mark_through_ref(T *p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q) {
+inline void ShenandoahConcurrentMark::mark_through_ref(T *p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q, ShenandoahMarkingContext* const mark_context) {
T o = RawAccess<>::oop_load(p);
if (!CompressedOops::is_null(o)) {
oop obj = CompressedOops::decode_not_null(o);
switch (UPDATE_REFS) {
case NONE:
@@ -264,11 +266,11 @@
// case we don't need to do anything else.
if (UPDATE_REFS != CONCURRENT || !CompressedOops::is_null(obj)) {
shenandoah_assert_not_forwarded(p, obj);
shenandoah_assert_not_in_cset_except(p, obj, heap->cancelled_gc());
- if (heap->next_marking_context()->mark(obj)) {
+ if (mark_context->mark(obj)) {
bool pushed = q->push(ShenandoahMarkTask(obj));
assert(pushed, "overflow queue should always succeed pushing");
if (STRING_DEDUP && ShenandoahStringDedup::is_candidate(obj)) {
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
< prev index next >