8387760: G1: Let G1ConcurrentMark::_chunks_in_chunk_list use the Atomic API

Reviewed-by: shade, aboldtch
This commit is contained in:
Thomas Schatzl 2026-07-07 12:53:43 +00:00
parent 432f005b87
commit c8d4c7d181
3 changed files with 7 additions and 7 deletions

View File

@ -299,7 +299,7 @@ void G1CMMarkStack::add_chunk_to_list(Atomic<TaskQueueEntryChunk*>* list, TaskQu
void G1CMMarkStack::add_chunk_to_chunk_list(TaskQueueEntryChunk* elem) {
MutexLocker x(G1MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag);
add_chunk_to_list(&_chunk_list, elem);
_chunks_in_chunk_list++;
_chunks_in_chunk_list.add_then_fetch(1u, memory_order_relaxed);
}
void G1CMMarkStack::add_chunk_to_free_list(TaskQueueEntryChunk* elem) {
@ -319,7 +319,7 @@ G1CMMarkStack::TaskQueueEntryChunk* G1CMMarkStack::remove_chunk_from_chunk_list(
MutexLocker x(G1MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag);
TaskQueueEntryChunk* result = remove_chunk_from_list(&_chunk_list);
if (result != nullptr) {
_chunks_in_chunk_list--;
_chunks_in_chunk_list.sub_then_fetch(1u, memory_order_relaxed);
}
return result;
}
@ -363,7 +363,7 @@ bool G1CMMarkStack::par_pop_chunk(G1TaskQueueEntry* ptr_arr) {
}
void G1CMMarkStack::set_empty() {
_chunks_in_chunk_list = 0;
_chunks_in_chunk_list.store_relaxed(0);
_chunk_list.store_relaxed(nullptr);
_free_list.store_relaxed(nullptr);
_chunk_allocator.reset();

View File

@ -213,8 +213,8 @@ private:
Atomic<TaskQueueEntryChunk*> _free_list; // Linked list of free chunks that can be allocated by users.
char _pad1[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*)];
Atomic<TaskQueueEntryChunk*> _chunk_list; // List of chunks currently containing data.
volatile size_t _chunks_in_chunk_list;
char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(size_t)];
Atomic<size_t> _chunks_in_chunk_list;
char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(_chunks_in_chunk_list)];
// Atomically add the given chunk to the list.
void add_chunk_to_list(Atomic<TaskQueueEntryChunk*>* list, TaskQueueEntryChunk* elem);
@ -265,7 +265,7 @@ private:
// Return the approximate number of oops on this mark stack. Racy due to
// unsynchronized access to _chunks_in_chunk_list.
size_t size() const { return _chunks_in_chunk_list * EntriesPerChunk; }
size_t size() const { return _chunks_in_chunk_list.load_relaxed() * EntriesPerChunk; }
void set_empty();

View File

@ -93,7 +93,7 @@ inline void G1CMMarkStack::iterate(Fn fn) const {
TaskQueueEntryChunk* cur = _chunk_list.load_relaxed();
while (cur != nullptr) {
guarantee(num_chunks <= _chunks_in_chunk_list, "Found %zu oop chunks which is more than there should be", num_chunks);
guarantee(num_chunks <= _chunks_in_chunk_list.load_relaxed(), "Found %zu oop chunks which is more than there should be", num_chunks);
for (size_t i = 0; i < EntriesPerChunk; ++i) {
if (cur->data[i].is_null()) {