310 return mspace_get_free_with_detach(0, age_mspace, thread); |
310 return mspace_get_free_with_detach(0, age_mspace, thread); |
311 } |
311 } |
312 |
312 |
313 static bool insert_full_age_node(JfrAgeNode* age_node, JfrStorageAgeMspace* age_mspace, Thread* thread) { |
313 static bool insert_full_age_node(JfrAgeNode* age_node, JfrStorageAgeMspace* age_mspace, Thread* thread) { |
314 assert(JfrBuffer_lock->owned_by_self(), "invariant"); |
314 assert(JfrBuffer_lock->owned_by_self(), "invariant"); |
|
315 assert(age_node != NULL, "invariant"); |
|
316 assert(age_node->acquired_by_self(), "invariant"); |
315 assert(age_node->retired_buffer()->retired(), "invariant"); |
317 assert(age_node->retired_buffer()->retired(), "invariant"); |
|
318 age_node->release(); // drop identity claim on age node when inserting to full list |
|
319 assert(age_node->identity() == NULL, "invariant"); |
316 age_mspace->insert_full_head(age_node); |
320 age_mspace->insert_full_head(age_node); |
317 return true; |
321 return true; |
318 } |
322 } |
319 |
323 |
320 static bool full_buffer_registration(BufferPtr buffer, JfrStorageAgeMspace* age_mspace, JfrStorageControl& control, Thread* thread) { |
324 static bool full_buffer_registration(BufferPtr buffer, JfrStorageAgeMspace* age_mspace, JfrStorageControl& control, Thread* thread) { |
327 age_node = new_age_node(buffer, age_mspace, thread); |
331 age_node = new_age_node(buffer, age_mspace, thread); |
328 if (age_node == NULL) { |
332 if (age_node == NULL) { |
329 return false; |
333 return false; |
330 } |
334 } |
331 } |
335 } |
|
336 assert(age_node != NULL, "invariant"); |
332 assert(age_node->acquired_by_self(), "invariant"); |
337 assert(age_node->acquired_by_self(), "invariant"); |
333 assert(age_node != NULL, "invariant"); |
|
334 age_node->set_retired_buffer(buffer); |
338 age_node->set_retired_buffer(buffer); |
335 control.increment_full(); |
339 control.increment_full(); |
336 return insert_full_age_node(age_node, age_mspace, thread); |
340 return insert_full_age_node(age_node, age_mspace, thread); |
337 } |
341 } |
338 |
342 |
410 while (true) { |
414 while (true) { |
411 JfrAgeNode* const oldest_age_node = _age_mspace->full_tail(); |
415 JfrAgeNode* const oldest_age_node = _age_mspace->full_tail(); |
412 if (oldest_age_node == NULL) { |
416 if (oldest_age_node == NULL) { |
413 break; |
417 break; |
414 } |
418 } |
|
419 assert(oldest_age_node->identity() == NULL, "invariant"); |
415 BufferPtr const buffer = oldest_age_node->retired_buffer(); |
420 BufferPtr const buffer = oldest_age_node->retired_buffer(); |
416 assert(buffer->retired(), "invariant"); |
421 assert(buffer->retired(), "invariant"); |
417 discarded_size += buffer->unflushed_size(); |
422 discarded_size += buffer->unflushed_size(); |
418 num_full_post_discard = control().decrement_full(); |
423 num_full_post_discard = control().decrement_full(); |
419 if (buffer->transient()) { |
424 if (buffer->transient()) { |
421 mspace_release_full(oldest_age_node, _age_mspace); |
426 mspace_release_full(oldest_age_node, _age_mspace); |
422 continue; |
427 continue; |
423 } else { |
428 } else { |
424 mspace_release_full(oldest_age_node, _age_mspace); |
429 mspace_release_full(oldest_age_node, _age_mspace); |
425 buffer->reinitialize(); |
430 buffer->reinitialize(); |
426 buffer->release(); // pusb |
431 buffer->release(); // publish |
427 break; |
432 break; |
428 } |
433 } |
429 } |
434 } |
430 JfrBuffer_lock->unlock(); |
435 JfrBuffer_lock->unlock(); |
431 const size_t number_of_discards = num_full_pre_discard - num_full_post_discard; |
436 const size_t number_of_discards = num_full_pre_discard - num_full_post_discard; |
635 assert(count > 0, "invariant"); |
640 assert(count > 0, "invariant"); |
636 JfrAgeNode* node = head; |
641 JfrAgeNode* node = head; |
637 JfrAgeNode* last = NULL; |
642 JfrAgeNode* last = NULL; |
638 while (node != NULL) { |
643 while (node != NULL) { |
639 last = node; |
644 last = node; |
|
645 assert(node->identity() == NULL, "invariant"); |
640 BufferPtr const buffer = node->retired_buffer(); |
646 BufferPtr const buffer = node->retired_buffer(); |
641 assert(buffer != NULL, "invariant"); |
647 assert(buffer != NULL, "invariant"); |
642 assert(buffer->retired(), "invariant"); |
648 assert(buffer->retired(), "invariant"); |
643 processor.process(buffer); |
649 processor.process(buffer); |
644 // at this point, buffer is already live or destroyed |
650 // at this point, buffer is already live or destroyed |
645 node->clear_identity(); |
|
646 JfrAgeNode* const next = (JfrAgeNode*)node->next(); |
651 JfrAgeNode* const next = (JfrAgeNode*)node->next(); |
647 if (node->transient()) { |
652 if (node->transient()) { |
648 // detach |
653 // detach |
649 last = (JfrAgeNode*)last->prev(); |
654 last = (JfrAgeNode*)last->prev(); |
650 if (last != NULL) { |
655 if (last != NULL) { |