src/hotspot/share/gc/shared/ptrQueue.cpp
changeset 59250 a6deb69743d4
parent 59249 29b0d0b61615
child 59252 623722a6aeb9
equal deleted inserted replaced
59249:29b0d0b61615 59250:a6deb69743d4
   148     node = BufferNode::allocate(_buffer_size);
   148     node = BufferNode::allocate(_buffer_size);
   149   } else {
   149   } else {
   150     // Decrement count after getting buffer from free list.  This, along
   150     // Decrement count after getting buffer from free list.  This, along
   151     // with incrementing count before adding to free list, ensures count
   151     // with incrementing count before adding to free list, ensures count
   152     // never underflows.
   152     // never underflows.
   153     size_t count = Atomic::sub(1u, &_free_count);
   153     size_t count = Atomic::sub(&_free_count, 1u);
   154     assert((count + 1) != 0, "_free_count underflow");
   154     assert((count + 1) != 0, "_free_count underflow");
   155   }
   155   }
   156   return node;
   156   return node;
   157 }
   157 }
   158 
   158 
   210     size_t count = 1;
   210     size_t count = 1;
   211     for (BufferNode* next = first->next(); next != NULL; next = next->next()) {
   211     for (BufferNode* next = first->next(); next != NULL; next = next->next()) {
   212       last = next;
   212       last = next;
   213       ++count;
   213       ++count;
   214     }
   214     }
   215     Atomic::sub(count, &_pending_count);
   215     Atomic::sub(&_pending_count, count);
   216 
   216 
   217     // Wait for any in-progress pops, to avoid ABA for them.
   217     // Wait for any in-progress pops, to avoid ABA for them.
   218     GlobalCounter::write_synchronize();
   218     GlobalCounter::write_synchronize();
   219 
   219 
   220     // Add synchronized nodes to _free_list.
   220     // Add synchronized nodes to _free_list.
   234   for ( ; removed < remove_goal; ++removed) {
   234   for ( ; removed < remove_goal; ++removed) {
   235     BufferNode* node = _free_list.pop();
   235     BufferNode* node = _free_list.pop();
   236     if (node == NULL) break;
   236     if (node == NULL) break;
   237     BufferNode::deallocate(node);
   237     BufferNode::deallocate(node);
   238   }
   238   }
   239   size_t new_count = Atomic::sub(removed, &_free_count);
   239   size_t new_count = Atomic::sub(&_free_count, removed);
   240   log_debug(gc, ptrqueue, freelist)
   240   log_debug(gc, ptrqueue, freelist)
   241            ("Reduced %s free list by " SIZE_FORMAT " to " SIZE_FORMAT,
   241            ("Reduced %s free list by " SIZE_FORMAT " to " SIZE_FORMAT,
   242             name(), removed, new_count);
   242             name(), removed, new_count);
   243   return removed;
   243   return removed;
   244 }
   244 }