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 |