< prev index next > src/hotspot/share/gc/shenandoah/shenandoahStackWatermark.cpp
Print this page
/*
* Copyright (c) 2021, Red Hat, Inc. All rights reserved.
* Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
_heap->is_concurrent_mark_in_progress(),
"Only these two phases");
assert(Thread::current()->is_Worker_thread(), "Unexpected thread passing in context: " PTR_FORMAT, p2i(context));
return reinterpret_cast<OopClosure*>(context);
} else {
! if (_heap->is_concurrent_mark_in_progress()) {
- return &_keep_alive_cl;
- } else if (_heap->is_concurrent_weak_root_in_progress()) {
assert(_heap->is_evacuation_in_progress(), "Nothing to evacuate");
return &_evac_update_oop_cl;
} else {
ShouldNotReachHere();
return nullptr;
}
}
_heap->is_concurrent_mark_in_progress(),
"Only these two phases");
assert(Thread::current()->is_Worker_thread(), "Unexpected thread passing in context: " PTR_FORMAT, p2i(context));
return reinterpret_cast<OopClosure*>(context);
} else {
! if (_heap->is_concurrent_weak_root_in_progress()) {
assert(_heap->is_evacuation_in_progress(), "Nothing to evacuate");
return &_evac_update_oop_cl;
+ } else if (_heap->is_concurrent_mark_in_progress()) {
+ return &_keep_alive_cl;
} else {
ShouldNotReachHere();
return nullptr;
}
}
void ShenandoahStackWatermark::start_processing_impl(void* context) {
NoSafepointVerifier nsv;
ShenandoahHeap* const heap = ShenandoahHeap::heap();
// Process the non-frame part of the thread
! if (heap->is_concurrent_mark_in_progress()) {
- // We need to reset all TLABs because they might be below the TAMS, and we need to mark
- // the objects in them. Do not let mutators allocate any new objects in their current TLABs.
- // It is also a good place to resize the TLAB sizes for future allocations.
- retire_tlab();
-
- _jt->oops_do_no_frames(closure_from_context(context), &_nm_cl);
- } else if (heap->is_concurrent_weak_root_in_progress()) {
assert(heap->is_evacuation_in_progress(), "Should not be armed");
// Retire the TLABs, which will force threads to reacquire their TLABs.
// This is needed for two reasons. Strong one: new allocations would be with new freeset,
// which would be outside the collection set, so no cset writes would happen there.
// Weaker one: new allocations would happen past update watermark, and so less work would
// be needed for reference updates (would update the large filler instead).
retire_tlab();
_jt->oops_do_no_frames(closure_from_context(context), &_nm_cl);
} else {
ShouldNotReachHere();
}
void ShenandoahStackWatermark::start_processing_impl(void* context) {
NoSafepointVerifier nsv;
ShenandoahHeap* const heap = ShenandoahHeap::heap();
// Process the non-frame part of the thread
! if (heap->is_concurrent_weak_root_in_progress()) {
assert(heap->is_evacuation_in_progress(), "Should not be armed");
// Retire the TLABs, which will force threads to reacquire their TLABs.
// This is needed for two reasons. Strong one: new allocations would be with new freeset,
// which would be outside the collection set, so no cset writes would happen there.
// Weaker one: new allocations would happen past update watermark, and so less work would
// be needed for reference updates (would update the large filler instead).
retire_tlab();
+ _jt->oops_do_no_frames(closure_from_context(context), &_nm_cl);
+ } else if (heap->is_concurrent_mark_in_progress()) {
+ // We need to reset all TLABs because they might be below the TAMS, and we need to mark
+ // the objects in them. Do not let mutators allocate any new objects in their current TLABs.
+ // It is also a good place to resize the TLAB sizes for future allocations.
+ retire_tlab();
+
_jt->oops_do_no_frames(closure_from_context(context), &_nm_cl);
} else {
ShouldNotReachHere();
}
< prev index next >