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

Unified Diff: runtime/vm/timeline.cc

Issue 1275113003: Endless thread safe timeline recorder (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
« runtime/vm/timeline.h ('K') | « runtime/vm/timeline.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/timeline.cc
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 4c3fb9bf655cc927f1d1ab7923ba7258a9838b9e..12a47077a2665f4b70fc68ee5a32c39bcb2c5fbc 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -6,6 +6,7 @@
#include "vm/isolate.h"
#include "vm/json_stream.h"
+#include "vm/lockers.h"
#include "vm/object.h"
#include "vm/thread.h"
#include "vm/timeline.h"
@@ -13,6 +14,8 @@
namespace dart {
DEFINE_FLAG(bool, trace_timeline, false, "Timeline trace");
+// TODO(johnmccutchan): Flip this to false before committing.
+DEFINE_FLAG(bool, complete_timeline, true, "Record the complete timeline");
TimelineEvent::TimelineEvent()
: timestamp0_(0),
@@ -429,7 +432,7 @@ void TimelineEventRingRecorder::PrintJSONEvents(JSONArray* events) const {
}
-void TimelineEventRingRecorder::PrintJSON(JSONStream* js) const {
+void TimelineEventRingRecorder::PrintJSON(JSONStream* js) {
JSONObject topLevel(js);
topLevel.AddProperty("type", "_Timeline");
{
@@ -481,7 +484,7 @@ TimelineEventStreamingRecorder::~TimelineEventStreamingRecorder() {
}
-void TimelineEventStreamingRecorder::PrintJSON(JSONStream* js) const {
+void TimelineEventStreamingRecorder::PrintJSON(JSONStream* js) {
JSONObject topLevel(js);
topLevel.AddProperty("type", "_Timeline");
{
@@ -514,4 +517,98 @@ void TimelineEventStreamingRecorder::CompleteEvent(TimelineEvent* event) {
delete event;
}
+
+TimelineEventEndlessRecorder::TimelineEventEndlessRecorder()
+ : head_(NULL) {
+ GetNewBlock();
+}
+
+
+void TimelineEventEndlessRecorder::PrintJSON(JSONStream* js) {
+ MutexLocker ml(&lock_);
+ JSONObject topLevel(js);
+ topLevel.AddProperty("type", "_Timeline");
+ {
+ JSONArray events(&topLevel, "traceEvents");
+ PrintJSONMeta(&events);
+ PrintJSONEvents(&events);
+ }
+}
+
+
+TimelineEventBlock* TimelineEventEndlessRecorder::GetNewBlock() {
+ MutexLocker ml(&lock_);
+ return GetNewBlockLocked();
+}
+
+
+void TimelineEventEndlessRecorder::VisitObjectPointers(
+ ObjectPointerVisitor* visitor) {
+ // no-op.
+}
+
+
+TimelineEvent* TimelineEventEndlessRecorder::StartEvent(const Object& object) {
+ return StartEvent();
+}
+
+
+TimelineEvent* TimelineEventEndlessRecorder::StartEvent() {
+ // Grab the thread's timeline event block.
+ Thread* thread = Thread::Current();
+ TimelineEventBlock* thread_block = thread->current_block();
+ if (thread_block == NULL) {
+ return NULL;
+ }
+ ASSERT(thread_block != NULL);
+ if (thread_block->IsFull()) {
+ // If it is full, request a new block.
+ thread_block = GetNewBlock();
+ thread->set_current_block(thread_block);
+ }
+ ASSERT(!thread_block->IsFull());
+ return thread_block->StartEvent();
+}
+
+
+void TimelineEventEndlessRecorder::CompleteEvent(TimelineEvent* event) {
+ // no-op.
+}
+
+
+TimelineEventBlock* TimelineEventEndlessRecorder::GetNewBlockLocked() {
+ TimelineEventBlock* block = new TimelineEventBlock();
+ block->set_next(head_);
+ head_ = block;
+ return head_;
+}
+
+
+void TimelineEventEndlessRecorder::PrintJSONEvents(JSONArray* events) const {
koda 2015/08/07 01:09:54 Since you don't lock here and in StartEvent, how d
Cutch 2015/08/07 16:47:42 Acknowledged.
+ TimelineEventBlock* current = head_;
+ while (current != NULL) {
+ intptr_t length = current->length();
+ for (intptr_t i = 0; i < length; i++) {
+ TimelineEvent* event = current->At(i);
+ if (!event->IsValid()) {
+ continue;
+ }
+ events->AddValue(event);
+ }
+ current = current->next();
+ }
+}
+
+
+TimelineEventBlock::TimelineEventBlock()
+ : next_(NULL),
+ length_(0) {
+}
+
+
+TimelineEvent* TimelineEventBlock::StartEvent() {
+ ASSERT(!IsFull());
+ return &events_[length_++];
+}
+
} // namespace dart
« runtime/vm/timeline.h ('K') | « runtime/vm/timeline.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698