src/hotspot/share/jfr/recorder/storage/jfrStorage.cpp
changeset 55053 d58e1a447d2b
parent 54964 ec7d6d8effc7
child 58154 060d9d139109
child 58863 c16ac7a2eba4
equal deleted inserted replaced
55052:05a408cbd945 55053:d58e1a447d2b
   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) {