303 size_t _elements; |
303 size_t _elements; |
304 bool _class_unload; |
304 bool _class_unload; |
305 bool _flushpoint; |
305 bool _flushpoint; |
306 public: |
306 public: |
307 explicit TypeSetSerialization(bool class_unload, bool flushpoint) : _elements(0), _class_unload(class_unload), _flushpoint(flushpoint) {} |
307 explicit TypeSetSerialization(bool class_unload, bool flushpoint) : _elements(0), _class_unload(class_unload), _flushpoint(flushpoint) {} |
308 void write(JfrCheckpointWriter& writer, JfrCheckpointWriter* leakp_writer) { |
308 void write(JfrCheckpointWriter& writer) { |
309 MutexLocker cld_lock(SafepointSynchronize::is_at_safepoint() ? NULL : ClassLoaderDataGraph_lock); |
309 MutexLocker cld_lock(SafepointSynchronize::is_at_safepoint() ? NULL : ClassLoaderDataGraph_lock); |
310 MutexLocker lock(SafepointSynchronize::is_at_safepoint() ? NULL : Module_lock); |
310 MutexLocker lock(SafepointSynchronize::is_at_safepoint() ? NULL : Module_lock); |
311 _elements = JfrTypeSet::serialize(&writer, leakp_writer, _class_unload, _flushpoint); |
311 _elements = JfrTypeSet::serialize(&writer, _class_unload, _flushpoint); |
312 } |
312 } |
313 size_t elements() const { |
313 size_t elements() const { |
314 return _elements; |
314 return _elements; |
315 } |
315 } |
316 }; |
316 }; |
317 |
317 |
318 void ClassUnloadTypeSet::serialize(JfrCheckpointWriter& writer) { |
318 void ClassUnloadTypeSet::serialize(JfrCheckpointWriter& writer) { |
319 TypeSetSerialization type_set(true, false); |
319 TypeSetSerialization type_set(true, false); |
|
320 type_set.write(writer); |
320 if (LeakProfiler::is_running()) { |
321 if (LeakProfiler::is_running()) { |
321 JfrCheckpointWriter leakp_writer(false, true, Thread::current()); |
322 ObjectSampleCheckpoint::on_type_set_unload(writer); |
322 type_set.write(writer, &leakp_writer); |
|
323 ObjectSampleCheckpoint::install(leakp_writer, true, true); |
|
324 return; |
323 return; |
325 } |
324 } |
326 type_set.write(writer, NULL); |
|
327 }; |
325 }; |
328 |
326 |
329 void FlushTypeSet::serialize(JfrCheckpointWriter& writer) { |
327 void FlushTypeSet::serialize(JfrCheckpointWriter& writer) { |
330 assert(!SafepointSynchronize::is_at_safepoint(), "invariant"); |
328 assert(!SafepointSynchronize::is_at_safepoint(), "invariant"); |
331 TypeSetSerialization type_set(false, true); |
329 TypeSetSerialization type_set(false, true); |
332 type_set.write(writer, NULL); |
330 type_set.write(writer); |
333 _elements = type_set.elements(); |
331 _elements = type_set.elements(); |
334 } |
332 } |
335 |
333 |
336 size_t FlushTypeSet::elements() const { |
334 size_t FlushTypeSet::elements() const { |
337 return _elements; |
335 return _elements; |
338 } |
336 } |
339 |
337 |
340 void TypeSet::serialize(JfrCheckpointWriter& writer) { |
338 void TypeSet::serialize(JfrCheckpointWriter& writer) { |
341 TypeSetSerialization type_set(false, false); |
339 TypeSetSerialization type_set(false, false); |
342 if (LeakProfiler::is_suspended()) { |
340 type_set.write(writer); |
343 JfrCheckpointWriter leakp_writer(false, true, Thread::current()); |
|
344 type_set.write(writer, &leakp_writer); |
|
345 ObjectSampleCheckpoint::install(leakp_writer, false, true); |
|
346 return; |
|
347 } |
|
348 type_set.write(writer, NULL); |
|
349 }; |
341 }; |
350 |
342 |
351 void ThreadStateConstant::serialize(JfrCheckpointWriter& writer) { |
343 void ThreadStateConstant::serialize(JfrCheckpointWriter& writer) { |
352 JfrThreadState::serialize(writer); |
344 JfrThreadState::serialize(writer); |
353 } |
345 } |