src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp
changeset 50703 0486d7749b8d
parent 50429 83aec1d357d4
child 52212 e6973df15152
equal deleted inserted replaced
50702:2c9e2ec54a11 50703:0486d7749b8d
    64 
    64 
    65 JfrCheckpointManager::JfrCheckpointManager(JfrChunkWriter& cw) :
    65 JfrCheckpointManager::JfrCheckpointManager(JfrChunkWriter& cw) :
    66   _free_list_mspace(NULL),
    66   _free_list_mspace(NULL),
    67   _epoch_transition_mspace(NULL),
    67   _epoch_transition_mspace(NULL),
    68   _lock(NULL),
    68   _lock(NULL),
    69   _type_manager(NULL),
       
    70   _service_thread(NULL),
    69   _service_thread(NULL),
    71   _chunkwriter(cw),
    70   _chunkwriter(cw),
    72   _checkpoint_epoch_state(JfrTraceIdEpoch::epoch()) {}
    71   _checkpoint_epoch_state(JfrTraceIdEpoch::epoch()) {}
    73 
    72 
    74 JfrCheckpointManager::~JfrCheckpointManager() {
    73 JfrCheckpointManager::~JfrCheckpointManager() {
    79     delete _epoch_transition_mspace;
    78     delete _epoch_transition_mspace;
    80   }
    79   }
    81   if (_lock != NULL) {
    80   if (_lock != NULL) {
    82     delete _lock;
    81     delete _lock;
    83   }
    82   }
    84   if (_type_manager) {
    83   JfrTypeManager::clear();
    85     delete _type_manager;
       
    86   }
       
    87 }
    84 }
    88 
    85 
    89 static const size_t unlimited_mspace_size = 0;
    86 static const size_t unlimited_mspace_size = 0;
    90 static const size_t checkpoint_buffer_cache_count = 2;
    87 static const size_t checkpoint_buffer_cache_count = 2;
    91 static const size_t checkpoint_buffer_size = 512 * K;
    88 static const size_t checkpoint_buffer_size = 512 * K;
   107   assert(_epoch_transition_mspace == NULL, "invariant");
   104   assert(_epoch_transition_mspace == NULL, "invariant");
   108   _epoch_transition_mspace = create_mspace(checkpoint_buffer_size, unlimited_mspace_size, checkpoint_buffer_cache_count, this);
   105   _epoch_transition_mspace = create_mspace(checkpoint_buffer_size, unlimited_mspace_size, checkpoint_buffer_cache_count, this);
   109   if (_epoch_transition_mspace == NULL) {
   106   if (_epoch_transition_mspace == NULL) {
   110     return false;
   107     return false;
   111   }
   108   }
   112   assert(_type_manager == NULL, "invariant");
       
   113   _type_manager = new JfrTypeManager();
       
   114   if (_type_manager == NULL || !_type_manager->initialize()) {
       
   115     return false;
       
   116   }
       
   117   assert(_lock == NULL, "invariant");
   109   assert(_lock == NULL, "invariant");
   118   _lock = new Mutex(Monitor::leaf - 1, "Checkpoint mutex", Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never);
   110   _lock = new Mutex(Monitor::leaf - 1, "Checkpoint mutex", Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never);
   119   return _lock != NULL;
   111   if (_lock == NULL) {
       
   112     return false;
       
   113   }
       
   114   return JfrTypeManager::initialize();
   120 }
   115 }
   121 
   116 
   122 bool JfrCheckpointManager::use_epoch_transition_mspace(const Thread* thread) const {
   117 bool JfrCheckpointManager::use_epoch_transition_mspace(const Thread* thread) const {
   123   return _service_thread != thread && OrderAccess::load_acquire(&_checkpoint_epoch_state) != JfrTraceIdEpoch::epoch();
   118   return _service_thread != thread && OrderAccess::load_acquire(&_checkpoint_epoch_state) != JfrTraceIdEpoch::epoch();
   124 }
   119 }
   352   process_free_list(discarder, _epoch_transition_mspace);
   347   process_free_list(discarder, _epoch_transition_mspace);
   353   synchronize_epoch();
   348   synchronize_epoch();
   354   return discarder.processed();
   349   return discarder.processed();
   355 }
   350 }
   356 
   351 
   357 bool JfrCheckpointManager::register_serializer(JfrTypeId id, bool require_safepoint, bool permit_cache, JfrSerializer* cs) {
       
   358   assert(cs != NULL, "invariant");
       
   359   return instance()._type_manager->register_serializer(id, require_safepoint, permit_cache, cs);
       
   360 }
       
   361 
       
   362 size_t JfrCheckpointManager::write_types() {
   352 size_t JfrCheckpointManager::write_types() {
   363   JfrCheckpointWriter writer(false, true, Thread::current());
   353   JfrCheckpointWriter writer(false, true, Thread::current());
   364   _type_manager->write_types(writer);
   354   JfrTypeManager::write_types(writer);
   365   return writer.used_size();
   355   return writer.used_size();
   366 }
   356 }
   367 
   357 
   368 size_t JfrCheckpointManager::write_safepoint_types() {
   358 size_t JfrCheckpointManager::write_safepoint_types() {
   369   // this is also a "flushpoint"
   359   // this is also a "flushpoint"
   370   JfrCheckpointWriter writer(true, true, Thread::current());
   360   JfrCheckpointWriter writer(true, true, Thread::current());
   371   _type_manager->write_safepoint_types(writer);
   361   JfrTypeManager::write_safepoint_types(writer);
   372   return writer.used_size();
   362   return writer.used_size();
   373 }
   363 }
   374 
   364 
   375 void JfrCheckpointManager::write_type_set() {
   365 void JfrCheckpointManager::write_type_set() {
   376   _type_manager->write_type_set();
   366   JfrTypeManager::write_type_set();
   377 }
   367 }
   378 
   368 
   379 void JfrCheckpointManager::write_type_set_for_unloaded_classes() {
   369 void JfrCheckpointManager::write_type_set_for_unloaded_classes() {
   380   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
   370   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
   381   instance()._type_manager->write_type_set_for_unloaded_classes();
   371   JfrTypeManager::write_type_set_for_unloaded_classes();
   382 }
   372 }
   383 
   373 
   384 void JfrCheckpointManager::create_thread_checkpoint(JavaThread* jt) {
   374 void JfrCheckpointManager::create_thread_checkpoint(JavaThread* jt) {
   385   instance()._type_manager->create_thread_checkpoint(jt);
   375   JfrTypeManager::create_thread_checkpoint(jt);
   386 }
   376 }
   387 
   377 
   388 void JfrCheckpointManager::write_thread_checkpoint(JavaThread* jt) {
   378 void JfrCheckpointManager::write_thread_checkpoint(JavaThread* jt) {
   389   instance()._type_manager->write_thread_checkpoint(jt);
   379   JfrTypeManager::write_thread_checkpoint(jt);
   390 }
   380 }