mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8376119: G1: Convert volatiles in G1CMMarkStack to Atomic<T>
Reviewed-by: kbarrett, iwalulya
This commit is contained in:
parent
90d065e677
commit
42c0126fb2
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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(); }
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user