255 assert(trace->id() == id, "invariant");
256 trace->write(writer);
257 return id;
258 }
259
260 JfrStackTraceRepository::StackTrace::StackTrace(traceid id, const JfrStackTrace& trace, JfrStackTraceRepository::StackTrace* next) :
261 _next(next),
262 _frames(NULL),
263 _id(id),
264 _nr_of_frames(trace._nr_of_frames),
265 _hash(trace._hash),
266 _reached_root(trace._reached_root),
267 _written(false) {
268 if (_nr_of_frames > 0) {
269 _frames = NEW_C_HEAP_ARRAY(JfrStackFrame, _nr_of_frames, mtTracing);
270 memcpy(_frames, trace._frames, _nr_of_frames * sizeof(JfrStackFrame));
271 }
272 }
273
274 JfrStackTraceRepository::StackTrace::~StackTrace() {
275 if (_frames != NULL) {
276 FREE_C_HEAP_ARRAY(JfrStackFrame, _frames);
277 }
278 }
279
280 bool JfrStackTraceRepository::StackTrace::equals(const JfrStackTrace& rhs) const {
281 if (_reached_root != rhs._reached_root || _nr_of_frames != rhs._nr_of_frames || _hash != rhs._hash) {
282 return false;
283 }
284 for (u4 i = 0; i < _nr_of_frames; ++i) {
285 if (!_frames[i].equals(rhs._frames[i])) {
286 return false;
287 }
288 }
289 return true;
290 }
291
292 template <typename Writer>
293 static void write_stacktrace(Writer& w, traceid id, bool reached_root, u4 nr_of_frames, const JfrStackFrame* frames) {
294 w.write((u8)id);
295 w.write((u1)!reached_root);
296 w.write(nr_of_frames);
297 for (u4 i = 0; i < nr_of_frames; ++i) {
|
255 assert(trace->id() == id, "invariant");
256 trace->write(writer);
257 return id;
258 }
259
260 JfrStackTraceRepository::StackTrace::StackTrace(traceid id, const JfrStackTrace& trace, JfrStackTraceRepository::StackTrace* next) :
261 _next(next),
262 _frames(NULL),
263 _id(id),
264 _nr_of_frames(trace._nr_of_frames),
265 _hash(trace._hash),
266 _reached_root(trace._reached_root),
267 _written(false) {
268 if (_nr_of_frames > 0) {
269 _frames = NEW_C_HEAP_ARRAY(JfrStackFrame, _nr_of_frames, mtTracing);
270 memcpy(_frames, trace._frames, _nr_of_frames * sizeof(JfrStackFrame));
271 }
272 }
273
274 JfrStackTraceRepository::StackTrace::~StackTrace() {
275 FREE_C_HEAP_ARRAY(JfrStackFrame, _frames);
276 }
277
278 bool JfrStackTraceRepository::StackTrace::equals(const JfrStackTrace& rhs) const {
279 if (_reached_root != rhs._reached_root || _nr_of_frames != rhs._nr_of_frames || _hash != rhs._hash) {
280 return false;
281 }
282 for (u4 i = 0; i < _nr_of_frames; ++i) {
283 if (!_frames[i].equals(rhs._frames[i])) {
284 return false;
285 }
286 }
287 return true;
288 }
289
290 template <typename Writer>
291 static void write_stacktrace(Writer& w, traceid id, bool reached_root, u4 nr_of_frames, const JfrStackFrame* frames) {
292 w.write((u8)id);
293 w.write((u1)!reached_root);
294 w.write(nr_of_frames);
295 for (u4 i = 0; i < nr_of_frames; ++i) {
|