< prev index next >
src/share/vm/gc/g1/g1ConcurrentMark.cpp
Print this page
@@ -239,12 +239,15 @@
return result;
}
G1CMMarkStack::OopChunk* G1CMMarkStack::remove_chunk_from_chunk_list() {
MutexLockerEx x(MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag);
+ OopChunk* result = remove_chunk_from_list(&_chunk_list);
+ if (result != NULL) {
_chunks_in_chunk_list--;
- return remove_chunk_from_list(&_chunk_list);
+ }
+ return result;
}
G1CMMarkStack::OopChunk* G1CMMarkStack::remove_chunk_from_free_list() {
MutexLockerEx x(MarkStackFreeList_lock, Mutex::_no_safepoint_check_flag);
return remove_chunk_from_list(&_free_list);
@@ -268,11 +271,11 @@
return result;
}
bool G1CMMarkStack::par_push_chunk(oop* ptr_arr) {
// Get a new chunk.
- OopChunk* new_chunk = remove_chunk_from_list(&_free_list);
+ OopChunk* new_chunk = remove_chunk_from_free_list();
if (new_chunk == NULL) {
// Did not get a chunk from the free list. Allocate from backing memory.
new_chunk = allocate_new_chunk();
}
@@ -282,28 +285,25 @@
return false;
}
Copy::conjoint_oops_atomic(ptr_arr, new_chunk->data, OopsPerChunk);
- add_chunk_to_list(&_chunk_list, new_chunk);
- Atomic::inc(&_chunks_in_chunk_list);
+ add_chunk_to_chunk_list(new_chunk);
return true;
}
bool G1CMMarkStack::par_pop_chunk(oop* ptr_arr) {
- OopChunk* cur = remove_chunk_from_list(&_chunk_list);
+ OopChunk* cur = remove_chunk_from_chunk_list();
if (cur == NULL) {
return false;
}
- Atomic::dec(&_chunks_in_chunk_list);
-
Copy::conjoint_oops_atomic(cur->data, ptr_arr, OopsPerChunk);
- add_chunk_to_list(&_free_list, cur);
+ add_chunk_to_free_list(cur);
return true;
}
void G1CMMarkStack::set_empty() {
_chunks_in_chunk_list = 0;
< prev index next >