< 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 >