8376119: G1: Convert volatiles in G1CMMarkStack to Atomic<T>

Reviewed-by: kbarrett, iwalulya
This commit is contained in:
Thomas Schatzl 2026-01-26 09:47:52 +00:00
parent 90d065e677
commit 42c0126fb2
3 changed files with 14 additions and 14 deletions

View File

@ -291,9 +291,9 @@ void G1CMMarkStack::expand() {
_chunk_allocator.try_expand(); _chunk_allocator.try_expand();
} }
void G1CMMarkStack::add_chunk_to_list(TaskQueueEntryChunk* volatile* list, TaskQueueEntryChunk* elem) { void G1CMMarkStack::add_chunk_to_list(Atomic<TaskQueueEntryChunk*>* list, TaskQueueEntryChunk* elem) {
elem->next = *list; elem->next = list->load_relaxed();
*list = elem; list->store_relaxed(elem);
} }
void G1CMMarkStack::add_chunk_to_chunk_list(TaskQueueEntryChunk* elem) { void G1CMMarkStack::add_chunk_to_chunk_list(TaskQueueEntryChunk* elem) {
@ -307,10 +307,10 @@ void G1CMMarkStack::add_chunk_to_free_list(TaskQueueEntryChunk* elem) {
add_chunk_to_list(&_free_list, elem); add_chunk_to_list(&_free_list, elem);
} }
G1CMMarkStack::TaskQueueEntryChunk* G1CMMarkStack::remove_chunk_from_list(TaskQueueEntryChunk* volatile* list) { G1CMMarkStack::TaskQueueEntryChunk* G1CMMarkStack::remove_chunk_from_list(Atomic<TaskQueueEntryChunk*>* list) {
TaskQueueEntryChunk* result = *list; TaskQueueEntryChunk* result = list->load_relaxed();
if (result != nullptr) { if (result != nullptr) {
*list = (*list)->next; list->store_relaxed(list->load_relaxed()->next);
} }
return result; return result;
} }
@ -364,8 +364,8 @@ bool G1CMMarkStack::par_pop_chunk(G1TaskQueueEntry* ptr_arr) {
void G1CMMarkStack::set_empty() { void G1CMMarkStack::set_empty() {
_chunks_in_chunk_list = 0; _chunks_in_chunk_list = 0;
_chunk_list = nullptr; _chunk_list.store_relaxed(nullptr);
_free_list = nullptr; _free_list.store_relaxed(nullptr);
_chunk_allocator.reset(); _chunk_allocator.reset();
} }

View File

@ -210,17 +210,17 @@ private:
ChunkAllocator _chunk_allocator; ChunkAllocator _chunk_allocator;
char _pad0[DEFAULT_PADDING_SIZE]; char _pad0[DEFAULT_PADDING_SIZE];
TaskQueueEntryChunk* volatile _free_list; // Linked list of free chunks that can be allocated by users. Atomic<TaskQueueEntryChunk*> _free_list; // Linked list of free chunks that can be allocated by users.
char _pad1[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*)]; char _pad1[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*)];
TaskQueueEntryChunk* volatile _chunk_list; // List of chunks currently containing data. Atomic<TaskQueueEntryChunk*> _chunk_list; // List of chunks currently containing data.
volatile size_t _chunks_in_chunk_list; volatile size_t _chunks_in_chunk_list;
char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(size_t)]; char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(size_t)];
// Atomically add the given chunk to the list. // Atomically add the given chunk to the list.
void add_chunk_to_list(TaskQueueEntryChunk* volatile* list, TaskQueueEntryChunk* elem); void add_chunk_to_list(Atomic<TaskQueueEntryChunk*>* list, TaskQueueEntryChunk* elem);
// Atomically remove and return a chunk from the given list. Returns null if the // Atomically remove and return a chunk from the given list. Returns null if the
// list is empty. // list is empty.
TaskQueueEntryChunk* remove_chunk_from_list(TaskQueueEntryChunk* volatile* list); TaskQueueEntryChunk* remove_chunk_from_list(Atomic<TaskQueueEntryChunk*>* list);
void add_chunk_to_chunk_list(TaskQueueEntryChunk* elem); void add_chunk_to_chunk_list(TaskQueueEntryChunk* elem);
void add_chunk_to_free_list(TaskQueueEntryChunk* elem); void add_chunk_to_free_list(TaskQueueEntryChunk* elem);
@ -252,7 +252,7 @@ private:
// Return whether the chunk list is empty. Racy due to unsynchronized access to // Return whether the chunk list is empty. Racy due to unsynchronized access to
// _chunk_list. // _chunk_list.
bool is_empty() const { return _chunk_list == nullptr; } bool is_empty() const { return _chunk_list.load_relaxed() == nullptr; }
size_t capacity() const { return _chunk_allocator.capacity(); } size_t capacity() const { return _chunk_allocator.capacity(); }

View File

@ -90,7 +90,7 @@ inline void G1CMMarkStack::iterate(Fn fn) const {
size_t num_chunks = 0; size_t num_chunks = 0;
TaskQueueEntryChunk* cur = _chunk_list; TaskQueueEntryChunk* cur = _chunk_list.load_relaxed();
while (cur != nullptr) { 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, "Found %zu oop chunks which is more than there should be", num_chunks);