Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: runtime/vm/profiler.h

Issue 2680213002: Updated MallocHooks to collect stack traces when memory is allocated. (Closed)
Patch Set: Rough first patch Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef RUNTIME_VM_PROFILER_H_ 5 #ifndef RUNTIME_VM_PROFILER_H_
6 #define RUNTIME_VM_PROFILER_H_ 6 #define RUNTIME_VM_PROFILER_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/bitfield.h" 9 #include "vm/bitfield.h"
10 #include "vm/code_observers.h" 10 #include "vm/code_observers.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 51
52 static void SetSampleDepth(intptr_t depth); 52 static void SetSampleDepth(intptr_t depth);
53 static void SetSamplePeriod(intptr_t period); 53 static void SetSamplePeriod(intptr_t period);
54 54
55 static SampleBuffer* sample_buffer() { return sample_buffer_; } 55 static SampleBuffer* sample_buffer() { return sample_buffer_; }
56 56
57 static void DumpStackTrace(void* context); 57 static void DumpStackTrace(void* context);
58 static void DumpStackTrace(); 58 static void DumpStackTrace();
59 59
60 static void SampleAllocation(Thread* thread, intptr_t cid); 60 static void SampleAllocation(Thread* thread, intptr_t cid);
61 static Sample* NativeSampleAllocation();
Cutch 2017/02/08 00:28:54 SampleNativeAllocation
bkonyi 2017/02/08 01:37:05 Done.
61 62
62 // SampleThread is called from inside the signal handler and hence it is very 63 // SampleThread is called from inside the signal handler and hence it is very
63 // critical that the implementation of SampleThread does not do any of the 64 // critical that the implementation of SampleThread does not do any of the
64 // following: 65 // following:
65 // * Accessing TLS -- Because on Windows the callback will be running in a 66 // * Accessing TLS -- Because on Windows the callback will be running in a
66 // different thread. 67 // different thread.
67 // * Allocating memory -- Because this takes locks which may already be 68 // * Allocating memory -- Because this takes locks which may already be
68 // held, resulting in a dead lock. 69 // held, resulting in a dead lock.
69 // * Taking a lock -- See above. 70 // * Taking a lock -- See above.
70 static void SampleThread(Thread* thread, const InterruptedThreadState& state); 71 static void SampleThread(Thread* thread, const InterruptedThreadState& state);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 262 }
262 263
263 bool is_allocation_sample() const { 264 bool is_allocation_sample() const {
264 return ClassAllocationSampleBit::decode(state_); 265 return ClassAllocationSampleBit::decode(state_);
265 } 266 }
266 267
267 void set_is_allocation_sample(bool allocation_sample) { 268 void set_is_allocation_sample(bool allocation_sample) {
268 state_ = ClassAllocationSampleBit::update(allocation_sample, state_); 269 state_ = ClassAllocationSampleBit::update(allocation_sample, state_);
269 } 270 }
270 271
272 bool is_native_allocation_sample() const {
273 return NativeAllocationSampleBit::decode(state_);
274 }
275
276 void set_is_native_allocation_sample(bool native_allocation_sample) {
277 state_ =
278 NativeAllocationSampleBit::update(native_allocation_sample, state_);
279 }
280
271 Thread::TaskKind thread_task() const { return ThreadTaskBit::decode(state_); } 281 Thread::TaskKind thread_task() const { return ThreadTaskBit::decode(state_); }
272 282
273 void set_thread_task(Thread::TaskKind task) { 283 void set_thread_task(Thread::TaskKind task) {
274 state_ = ThreadTaskBit::update(task, state_); 284 state_ = ThreadTaskBit::update(task, state_);
275 } 285 }
276 286
277 bool is_continuation_sample() const { 287 bool is_continuation_sample() const {
278 return ContinuationSampleBit::decode(state_); 288 return ContinuationSampleBit::decode(state_);
279 } 289 }
280 290
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 enum StateBits { 334 enum StateBits {
325 kHeadSampleBit = 0, 335 kHeadSampleBit = 0,
326 kLeafFrameIsDartBit = 1, 336 kLeafFrameIsDartBit = 1,
327 kIgnoreBit = 2, 337 kIgnoreBit = 2,
328 kExitFrameBit = 3, 338 kExitFrameBit = 3,
329 kMissingFrameInsertedBit = 4, 339 kMissingFrameInsertedBit = 4,
330 kTruncatedTraceBit = 5, 340 kTruncatedTraceBit = 5,
331 kClassAllocationSampleBit = 6, 341 kClassAllocationSampleBit = 6,
332 kContinuationSampleBit = 7, 342 kContinuationSampleBit = 7,
333 kThreadTaskBit = 8, // 5 bits. 343 kThreadTaskBit = 8, // 5 bits.
334 kNextFreeBit = 13, 344 kNativeAllocationSampleBit = 13,
345 kNextFreeBit = 14,
335 }; 346 };
336 class HeadSampleBit : public BitField<uword, bool, kHeadSampleBit, 1> {}; 347 class HeadSampleBit : public BitField<uword, bool, kHeadSampleBit, 1> {};
337 class LeafFrameIsDart : public BitField<uword, bool, kLeafFrameIsDartBit, 1> { 348 class LeafFrameIsDart : public BitField<uword, bool, kLeafFrameIsDartBit, 1> {
338 }; 349 };
339 class IgnoreBit : public BitField<uword, bool, kIgnoreBit, 1> {}; 350 class IgnoreBit : public BitField<uword, bool, kIgnoreBit, 1> {};
340 class ExitFrameBit : public BitField<uword, bool, kExitFrameBit, 1> {}; 351 class ExitFrameBit : public BitField<uword, bool, kExitFrameBit, 1> {};
341 class MissingFrameInsertedBit 352 class MissingFrameInsertedBit
342 : public BitField<uword, bool, kMissingFrameInsertedBit, 1> {}; 353 : public BitField<uword, bool, kMissingFrameInsertedBit, 1> {};
343 class TruncatedTraceBit 354 class TruncatedTraceBit
344 : public BitField<uword, bool, kTruncatedTraceBit, 1> {}; 355 : public BitField<uword, bool, kTruncatedTraceBit, 1> {};
345 class ClassAllocationSampleBit 356 class ClassAllocationSampleBit
346 : public BitField<uword, bool, kClassAllocationSampleBit, 1> {}; 357 : public BitField<uword, bool, kClassAllocationSampleBit, 1> {};
358 class NativeAllocationSampleBit
359 : public BitField<uword, bool, kNativeAllocationSampleBit, 1> {};
347 class ContinuationSampleBit 360 class ContinuationSampleBit
348 : public BitField<uword, bool, kContinuationSampleBit, 1> {}; 361 : public BitField<uword, bool, kContinuationSampleBit, 1> {};
349 class ThreadTaskBit 362 class ThreadTaskBit
350 : public BitField<uword, Thread::TaskKind, kThreadTaskBit, 5> {}; 363 : public BitField<uword, Thread::TaskKind, kThreadTaskBit, 5> {};
351 364
352 int64_t timestamp_; 365 int64_t timestamp_;
353 ThreadId tid_; 366 ThreadId tid_;
354 Isolate* isolate_; 367 Isolate* isolate_;
355 uword pc_marker_; 368 uword pc_marker_;
356 uword stack_buffer_[kStackBufferSizeInWords]; 369 uword stack_buffer_[kStackBufferSizeInWords];
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 private: 622 private:
610 ZoneGrowableArray<ProcessedSample*> samples_; 623 ZoneGrowableArray<ProcessedSample*> samples_;
611 CodeLookupTable* code_lookup_table_; 624 CodeLookupTable* code_lookup_table_;
612 625
613 DISALLOW_COPY_AND_ASSIGN(ProcessedSampleBuffer); 626 DISALLOW_COPY_AND_ASSIGN(ProcessedSampleBuffer);
614 }; 627 };
615 628
616 } // namespace dart 629 } // namespace dart
617 630
618 #endif // RUNTIME_VM_PROFILER_H_ 631 #endif // RUNTIME_VM_PROFILER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698