src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp
changeset 58863 c16ac7a2eba4
parent 58842 6c255334120d
child 58948 18659e040c64
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
    29 #include "gc/shared/gcCause.hpp"
    29 #include "gc/shared/gcCause.hpp"
    30 #include "gc/shared/gcName.hpp"
    30 #include "gc/shared/gcName.hpp"
    31 #include "gc/shared/gcTrace.hpp"
    31 #include "gc/shared/gcTrace.hpp"
    32 #include "gc/shared/gcWhen.hpp"
    32 #include "gc/shared/gcWhen.hpp"
    33 #include "jfr/leakprofiler/leakProfiler.hpp"
    33 #include "jfr/leakprofiler/leakProfiler.hpp"
    34 #include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp"
    34 #include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp"
    35 #include "jfr/recorder/checkpoint/types/jfrType.hpp"
    35 #include "jfr/recorder/checkpoint/types/jfrType.hpp"
    36 #include "jfr/recorder/jfrRecorder.hpp"
    36 #include "jfr/recorder/jfrRecorder.hpp"
    37 #include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp"
    37 #include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp"
    38 #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp"
    38 #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp"
    39 #include "jfr/support/jfrThreadLocal.hpp"
    39 #include "jfr/support/jfrThreadLocal.hpp"
    40 #include "jfr/writers/jfrJavaEventWriter.hpp"
    40 #include "jfr/writers/jfrJavaEventWriter.hpp"
       
    41 #include "jfr/utilities/jfrThreadIterator.hpp"
    41 #include "memory/metaspaceGCThresholdUpdater.hpp"
    42 #include "memory/metaspaceGCThresholdUpdater.hpp"
    42 #include "memory/referenceType.hpp"
    43 #include "memory/referenceType.hpp"
    43 #include "memory/universe.hpp"
    44 #include "memory/universe.hpp"
    44 #include "oops/compressedOops.hpp"
    45 #include "oops/compressedOops.hpp"
    45 #include "runtime/flags/jvmFlag.hpp"
    46 #include "runtime/flags/jvmFlag.hpp"
    82   }
    83   }
    83 
    84 
    84   void do_thread(Thread* t);
    85   void do_thread(Thread* t);
    85 };
    86 };
    86 
    87 
    87 // Requires a ResourceMark for get_thread_name/as_utf8
       
    88 void JfrCheckpointThreadClosure::do_thread(Thread* t) {
    88 void JfrCheckpointThreadClosure::do_thread(Thread* t) {
    89   assert(t != NULL, "invariant");
    89   assert(t != NULL, "invariant");
    90   assert_locked_or_safepoint(Threads_lock);
       
    91   const JfrThreadLocal* const tl = t->jfr_thread_local();
       
    92   assert(tl != NULL, "invariant");
       
    93   if (tl->is_dead()) {
       
    94     return;
       
    95   }
       
    96   ++_count;
    90   ++_count;
    97   _writer.write_key(tl->thread_id());
    91   _writer.write_key(JfrThreadId::jfr_id(t));
    98   _writer.write(t->name());
    92   const char* const name = JfrThreadName::name(t);
    99   const OSThread* const os_thread = t->osthread();
    93   assert(name != NULL, "invariant");
   100   _writer.write<traceid>(os_thread != NULL ? os_thread->thread_id() : 0);
    94   _writer.write(name);
       
    95   _writer.write<traceid>(JfrThreadId::os_id(t));
   101   if (t->is_Java_thread()) {
    96   if (t->is_Java_thread()) {
   102     JavaThread* const jt = (JavaThread*)t;
    97     _writer.write(name);
   103     _writer.write(jt->name());
    98     _writer.write(JfrThreadId::id(t));
   104     _writer.write(java_lang_Thread::thread_id(jt->threadObj()));
    99     _writer.write(JfrThreadGroup::thread_group_id((JavaThread*)t, _curthread));
   105     _writer.write(JfrThreadGroup::thread_group_id(jt, _curthread));
       
   106     // since we are iterating threads during a safepoint, also issue notification
       
   107     JfrJavaEventWriter::notify(jt);
       
   108     return;
   100     return;
   109   }
   101   }
   110   _writer.write((const char*)NULL); // java name
   102   _writer.write((const char*)NULL); // java name
   111   _writer.write((traceid)0); // java thread id
   103   _writer.write((traceid)0); // java thread id
   112   _writer.write((traceid)0); // java thread group
   104   _writer.write((traceid)0); // java thread group
   113 }
   105 }
   114 
   106 
   115 void JfrThreadConstantSet::serialize(JfrCheckpointWriter& writer) {
   107 void JfrThreadConstantSet::serialize(JfrCheckpointWriter& writer) {
   116   assert(SafepointSynchronize::is_at_safepoint(), "invariant");
       
   117   JfrCheckpointThreadClosure tc(writer);
   108   JfrCheckpointThreadClosure tc(writer);
   118   Threads::threads_do(&tc);
   109   JfrJavaThreadIterator javathreads;
       
   110   while (javathreads.has_next()) {
       
   111     tc.do_thread(javathreads.next());
       
   112   }
       
   113   JfrNonJavaThreadIterator nonjavathreads;
       
   114   while (nonjavathreads.has_next()) {
       
   115     tc.do_thread(nonjavathreads.next());
       
   116   }
   119 }
   117 }
   120 
   118 
   121 void JfrThreadGroupConstant::serialize(JfrCheckpointWriter& writer) {
   119 void JfrThreadGroupConstant::serialize(JfrCheckpointWriter& writer) {
   122   assert(SafepointSynchronize::is_at_safepoint(), "invariant");
       
   123   JfrThreadGroup::serialize(writer);
   120   JfrThreadGroup::serialize(writer);
   124 }
   121 }
   125 
   122 
   126 static const char* flag_value_origin_to_string(JVMFlag::Flags origin) {
   123 static const char* flag_value_origin_to_string(JVMFlag::Flags origin) {
   127   switch (origin) {
   124   switch (origin) {
   276 }
   273 }
   277 
   274 
   278 void JfrThreadConstant::serialize(JfrCheckpointWriter& writer) {
   275 void JfrThreadConstant::serialize(JfrCheckpointWriter& writer) {
   279   assert(_thread != NULL, "invariant");
   276   assert(_thread != NULL, "invariant");
   280   assert(_thread == Thread::current(), "invariant");
   277   assert(_thread == Thread::current(), "invariant");
   281   assert(_thread->is_Java_thread(), "invariant");
       
   282   ResourceMark rm(_thread);
       
   283   const oop threadObj = _thread->threadObj();
       
   284   assert(threadObj != NULL, "invariant");
       
   285   const u8 java_lang_thread_id = java_lang_Thread::thread_id(threadObj);
       
   286   const char* const thread_name = _thread->name();
       
   287   const traceid thread_group_id = JfrThreadGroup::thread_group_id(_thread);
       
   288   writer.write_count(1);
   278   writer.write_count(1);
   289   writer.write_key(_thread->jfr_thread_local()->thread_id());
   279   writer.write_key(JfrThreadId::jfr_id(_thread));
   290   writer.write(thread_name);
   280   const char* const name = JfrThreadName::name(_thread);
   291   writer.write((traceid)_thread->osthread()->thread_id());
   281   writer.write(name);
   292   writer.write(thread_name);
   282   writer.write(JfrThreadId::os_id(_thread));
   293   writer.write(java_lang_thread_id);
   283   if (_thread->is_Java_thread()) {
   294   writer.write(thread_group_id);
   284     writer.write(name);
   295   JfrThreadGroup::serialize(&writer, thread_group_id);
   285     writer.write(JfrThreadId::id(_thread));
   296 }
   286     JavaThread* const jt = (JavaThread*)_thread;
       
   287     const traceid thread_group_id = JfrThreadGroup::thread_group_id(jt, jt);
       
   288     writer.write(thread_group_id);
       
   289     JfrThreadGroup::serialize(&writer, thread_group_id);
       
   290     return;
       
   291   }
       
   292   writer.write((const char*)NULL); // java name
       
   293   writer.write((traceid)0); // java thread id
       
   294   writer.write((traceid)0); // java thread group
       
   295 }