src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.cpp
changeset 58863 c16ac7a2eba4
parent 58132 caa25ab47aca
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
    60     writer.write("Native");
    60     writer.write("Native");
    61   }
    61   }
    62 };
    62 };
    63 
    63 
    64 bool JfrStackTraceRepository::initialize() {
    64 bool JfrStackTraceRepository::initialize() {
    65   return JfrSerializer::register_serializer(TYPE_FRAMETYPE, false, true, new JfrFrameType());
    65   return JfrSerializer::register_serializer(TYPE_FRAMETYPE, true, new JfrFrameType());
    66 }
    66 }
    67 
    67 
    68 void JfrStackTraceRepository::destroy() {
    68 void JfrStackTraceRepository::destroy() {
    69   assert(_instance != NULL, "invarinat");
    69   assert(_instance != NULL, "invarinat");
    70   delete _instance;
    70   delete _instance;
    71   _instance = NULL;
    71   _instance = NULL;
    72 }
    72 }
    73 
    73 
    74 size_t JfrStackTraceRepository::write_impl(JfrChunkWriter& sw, bool clear) {
    74 static traceid last_id = 0;
       
    75 
       
    76 bool JfrStackTraceRepository::is_modified() const {
       
    77   return last_id != _next_id;
       
    78 }
       
    79 
       
    80 size_t JfrStackTraceRepository::write(JfrChunkWriter& sw, bool clear) {
       
    81   if (_entries == 0) {
       
    82     return 0;
       
    83   }
    75   MutexLocker lock(JfrStacktrace_lock, Mutex::_no_safepoint_check_flag);
    84   MutexLocker lock(JfrStacktrace_lock, Mutex::_no_safepoint_check_flag);
    76   assert(_entries > 0, "invariant");
    85   assert(_entries > 0, "invariant");
    77   int count = 0;
    86   int count = 0;
    78   for (u4 i = 0; i < TABLE_SIZE; ++i) {
    87   for (u4 i = 0; i < TABLE_SIZE; ++i) {
    79     JfrStackTrace* stacktrace = _table[i];
    88     JfrStackTrace* stacktrace = _table[i];
    91   }
   100   }
    92   if (clear) {
   101   if (clear) {
    93     memset(_table, 0, sizeof(_table));
   102     memset(_table, 0, sizeof(_table));
    94     _entries = 0;
   103     _entries = 0;
    95   }
   104   }
       
   105   last_id = _next_id;
    96   return count;
   106   return count;
    97 }
       
    98 
       
    99 size_t JfrStackTraceRepository::write(JfrChunkWriter& sw, bool clear) {
       
   100   return _entries > 0 ? write_impl(sw, clear) : 0;
       
   101 }
       
   102 
       
   103 traceid JfrStackTraceRepository::write(JfrCheckpointWriter& writer, traceid id, unsigned int hash) {
       
   104   assert(JfrStacktrace_lock->owned_by_self(), "invariant");
       
   105   const JfrStackTrace* const trace = lookup(hash, id);
       
   106   assert(trace != NULL, "invariant");
       
   107   assert(trace->hash() == hash, "invariant");
       
   108   assert(trace->id() == id, "invariant");
       
   109   trace->write(writer);
       
   110   return id;
       
   111 }
       
   112 
       
   113 void JfrStackTraceRepository::write_metadata(JfrCheckpointWriter& writer) {
       
   114   JfrFrameType fct;
       
   115   writer.write_type(TYPE_FRAMETYPE);
       
   116   fct.serialize(writer);
       
   117 }
   107 }
   118 
   108 
   119 size_t JfrStackTraceRepository::clear() {
   109 size_t JfrStackTraceRepository::clear() {
   120   MutexLocker lock(JfrStacktrace_lock, Mutex::_no_safepoint_check_flag);
   110   MutexLocker lock(JfrStacktrace_lock, Mutex::_no_safepoint_check_flag);
   121   if (_entries == 0) {
   111   if (_entries == 0) {
   140   JfrThreadLocal* const tl = thread->jfr_thread_local();
   130   JfrThreadLocal* const tl = thread->jfr_thread_local();
   141   assert(tl != NULL, "invariant");
   131   assert(tl != NULL, "invariant");
   142   if (tl->has_cached_stack_trace()) {
   132   if (tl->has_cached_stack_trace()) {
   143     return tl->cached_stack_trace_id();
   133     return tl->cached_stack_trace_id();
   144   }
   134   }
   145   if (!thread->is_Java_thread() || thread->is_hidden_from_external_view()) {
   135   if (!thread->is_Java_thread() || thread->is_hidden_from_external_view() || tl->is_excluded()) {
   146     return 0;
   136     return 0;
   147   }
   137   }
   148   JfrStackFrame* frames = tl->stackframes();
   138   JfrStackFrame* frames = tl->stackframes();
   149   if (frames == NULL) {
   139   if (frames == NULL) {
   150     // pending oom
   140     // pending oom