Index: runtime/vm/timeline.h |
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h |
index 3447ce1491f7549e65c965f14609c8d0c487f433..ae6edbed0aacf71fa85f988ce6f01fc2fa033aec 100644 |
--- a/runtime/vm/timeline.h |
+++ b/runtime/vm/timeline.h |
@@ -271,7 +271,8 @@ class TimelineEventBlock { |
public: |
static const intptr_t kBlockSize = 64; |
- TimelineEventBlock(); |
+ explicit TimelineEventBlock(intptr_t index); |
+ ~TimelineEventBlock(); |
TimelineEventBlock* next() const { |
return next_; |
@@ -284,6 +285,10 @@ class TimelineEventBlock { |
return length_; |
} |
+ intptr_t block_index() const { |
+ return block_index_; |
+ } |
+ |
bool IsEmpty() const { |
return length_ == 0; |
} |
@@ -298,6 +303,12 @@ class TimelineEventBlock { |
return &events_[index]; |
} |
+ const TimelineEvent* At(intptr_t index) const { |
+ ASSERT(index >= 0); |
+ ASSERT(index < kBlockSize); |
+ return &events_[index]; |
+ } |
+ |
// Attempt to sniff a thread id from the first event. |
ThreadId thread() const; |
// Attempt to sniff the timestamp from the first event. |
@@ -308,14 +319,19 @@ class TimelineEventBlock { |
// - events have monotonically increasing timestamps. |
bool CheckBlock(); |
+ // Call Reset on all events and set length to 0. |
+ void Reset(); |
+ |
protected: |
TimelineEvent* StartEvent(); |
TimelineEvent events_[kBlockSize]; |
TimelineEventBlock* next_; |
intptr_t length_; |
+ intptr_t block_index_; |
friend class TimelineEventEndlessRecorder; |
+ friend class TimelineEventRecorder; |
friend class TimelineTestHelper; |
private: |
@@ -331,11 +347,7 @@ class TimelineEventRecorder { |
// Interface method(s) which must be implemented. |
virtual void PrintJSON(JSONStream* js) = 0; |
- |
- // Override if recorder uses blocks. |
- virtual TimelineEventBlock* GetNewBlock() { |
- return NULL; |
- } |
+ virtual TimelineEventBlock* GetNewBlock() = 0; |
void WriteTo(const char* directory); |
@@ -348,6 +360,7 @@ class TimelineEventRecorder { |
// Utility method(s). |
void PrintJSONMeta(JSONArray* array) const; |
+ TimelineEvent* ThreadBlockStartEvent(); |
friend class TimelineStream; |
friend class Isolate; |
@@ -359,17 +372,15 @@ class TimelineEventRecorder { |
// A recorder that stores events in a ring buffer of fixed capacity. |
// This recorder does track Dart objects. |
-// TODO(johnmccutchan): Make this recorder use event blocks too. |
class TimelineEventRingRecorder : public TimelineEventRecorder { |
public: |
static const intptr_t kDefaultCapacity = 8192; |
- static intptr_t SizeForCapacity(intptr_t capacity); |
- |
explicit TimelineEventRingRecorder(intptr_t capacity = kDefaultCapacity); |
~TimelineEventRingRecorder(); |
void PrintJSON(JSONStream* js); |
+ TimelineEventBlock* GetNewBlock(); |
protected: |
void VisitObjectPointers(ObjectPointerVisitor* visitor); |
@@ -377,15 +388,16 @@ class TimelineEventRingRecorder : public TimelineEventRecorder { |
TimelineEvent* StartEvent(); |
void CompleteEvent(TimelineEvent* event); |
- void PrintJSONEvents(JSONArray* array) const; |
+ TimelineEventBlock* GetNewBlockLocked(); |
- intptr_t GetNextIndex(); |
+ void PrintJSONEvents(JSONArray* array) const; |
- // events_[i] and event_objects_[i] are indexed together. |
- TimelineEvent* events_; |
+ TimelineEventBlock** blocks_; |
RawArray* event_objects_; |
- uintptr_t cursor_; |
intptr_t capacity_; |
+ intptr_t num_blocks_; |
+ intptr_t block_cursor_; |
+ Mutex lock_; |
}; |
@@ -397,6 +409,9 @@ class TimelineEventStreamingRecorder : public TimelineEventRecorder { |
~TimelineEventStreamingRecorder(); |
void PrintJSON(JSONStream* js); |
+ virtual TimelineEventBlock* GetNewBlock() { |
+ return NULL; |
+ } |
// Called when |event| is ready to be streamed. It is unsafe to keep a |
// reference to |event| as it may be freed as soon as this function returns. |
@@ -441,6 +456,7 @@ class TimelineEventEndlessRecorder : public TimelineEventRecorder { |
Mutex lock_; |
TimelineEventBlock* head_; |
+ intptr_t block_index_; |
friend class TimelineEventBlockIterator; |
}; |