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() { |
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 } |