| Index: runtime/vm/timeline.h | 
| diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h | 
| index 6a9019dbd3dd8c729763bf50520750627e593deb..9372c04220e5b73d78d2b29cc07ca98ad29e9bc0 100644 | 
| --- a/runtime/vm/timeline.h | 
| +++ b/runtime/vm/timeline.h | 
| @@ -88,6 +88,7 @@ class TimelineEvent { | 
| // Keep in sync with StateBits below. | 
| enum EventType { | 
| kNone, | 
| +    kSerializedJSON,  // Events from Dart code. | 
| kBegin, | 
| kEnd, | 
| kDuration, | 
| @@ -130,9 +131,11 @@ class TimelineEvent { | 
| void End(const char* label, | 
| int64_t micros = OS::GetCurrentTraceMicros()); | 
|  | 
| +  void SerializedJSON(const char* json); | 
| + | 
| // Set the number of arguments in the event. | 
| void SetNumArguments(intptr_t length); | 
| -  // |name| must be a compile time constant. Takes ownership of |argumentp|. | 
| +  // |name| must be a compile time constant. Takes ownership of |argument|. | 
| void SetArgument(intptr_t i, const char* name, char* argument); | 
| // |name| must be a compile time constant. Copies |argument|. | 
| void CopyArgument(intptr_t i, const char* name, const char* argument); | 
| @@ -168,6 +171,10 @@ class TimelineEvent { | 
| return thread_; | 
| } | 
|  | 
| +  Dart_Port isolate_id() const { | 
| +    return isolate_id_; | 
| +  } | 
| + | 
| const char* label() const { | 
| return label_; | 
| } | 
| @@ -223,6 +230,8 @@ class TimelineEvent { | 
| } | 
| } | 
|  | 
| +  const char* GetSerializedJSON() const; | 
| + | 
| private: | 
| int64_t timestamp0_; | 
| int64_t timestamp1_; | 
| @@ -232,7 +241,7 @@ class TimelineEvent { | 
| const char* label_; | 
| const char* category_; | 
| ThreadId thread_; | 
| -  Isolate* isolate_; | 
| +  Dart_Port isolate_id_; | 
|  | 
| void FreeArguments(); | 
|  | 
| @@ -396,9 +405,6 @@ class TimelineEventBlock { | 
| 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. | 
| int64_t LowerTimeBound() const; | 
|  | 
| @@ -416,8 +422,8 @@ class TimelineEventBlock { | 
| } | 
|  | 
| // Only safe to access under the recorder's lock. | 
| -  Isolate* isolate() const { | 
| -    return isolate_; | 
| +  ThreadId thread_id() const { | 
| +    return thread_id_; | 
| } | 
|  | 
| protected: | 
| @@ -429,10 +435,10 @@ class TimelineEventBlock { | 
| intptr_t block_index_; | 
|  | 
| // Only accessed under the recorder's lock. | 
| -  Isolate* isolate_; | 
| +  ThreadId thread_id_; | 
| bool in_use_; | 
|  | 
| -  void Open(Isolate* isolate); | 
| +  void Open(); | 
| void Finish(); | 
|  | 
| friend class Thread; | 
| @@ -473,52 +479,23 @@ class TimelineEventFilter : public ValueObject { | 
|  | 
| class IsolateTimelineEventFilter : public TimelineEventFilter { | 
| public: | 
| -  explicit IsolateTimelineEventFilter(Isolate* isolate); | 
| +  explicit IsolateTimelineEventFilter(Dart_Port isolate_id); | 
|  | 
| bool IncludeBlock(TimelineEventBlock* block) { | 
| if (block == NULL) { | 
| return false; | 
| } | 
| // Not empty, not in use, and isolate match. | 
| -    return !block->IsEmpty() && !block->in_use() && | 
| -           (block->isolate() == isolate_); | 
| -  } | 
| - | 
| - private: | 
| -  Isolate* isolate_; | 
| -}; | 
| - | 
| - | 
| -// Timeline events from Dart code are eagerly converted to JSON and stored | 
| -// as a C string. | 
| -class DartTimelineEvent { | 
| - public: | 
| -  DartTimelineEvent(); | 
| -  ~DartTimelineEvent(); | 
| - | 
| -  void Clear(); | 
| - | 
| -  // This function makes a copy of |event|. | 
| -  void Init(Isolate* isolate, const char* event); | 
| - | 
| -  bool IsValid() const { | 
| -    return (isolate_ != NULL) && | 
| -           (event_as_json_ != NULL); | 
| -  } | 
| - | 
| -  Isolate* isolate() const { | 
| -    return isolate_; | 
| +    return !block->IsEmpty() && !block->in_use(); | 
| } | 
|  | 
| -  char* event_as_json() const { | 
| -    return event_as_json_; | 
| +  bool IncludeEvent(TimelineEvent* event) { | 
| +    return event->IsValid() && | 
| +           (event->isolate_id() == isolate_id_); | 
| } | 
|  | 
| private: | 
| -  Isolate* isolate_; | 
| -  char* event_as_json_; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(DartTimelineEvent); | 
| +  Dart_Port isolate_id_; | 
| }; | 
|  | 
|  | 
| @@ -538,9 +515,6 @@ class TimelineEventRecorder { | 
|  | 
| void FinishBlock(TimelineEventBlock* block); | 
|  | 
| -  // Interface method(s) which must be implemented. | 
| -  virtual void AppendDartEvent(Isolate* isolate, const char* event) = 0; | 
| - | 
| protected: | 
| void WriteTo(const char* directory); | 
|  | 
| @@ -548,9 +522,7 @@ class TimelineEventRecorder { | 
| virtual TimelineEvent* StartEvent() = 0; | 
| virtual void CompleteEvent(TimelineEvent* event) = 0; | 
| virtual TimelineEventBlock* GetHeadBlockLocked() = 0; | 
| -  virtual TimelineEventBlock* GetNewBlockLocked(Isolate* isolate) = 0; | 
| -  virtual intptr_t NumDartEventsLocked() = 0; | 
| -  virtual DartTimelineEvent* DartEventAtLocked(intptr_t i) = 0; | 
| +  virtual TimelineEventBlock* GetNewBlockLocked() = 0; | 
|  | 
| // Utility method(s). | 
| void PrintJSONMeta(JSONArray* array) const; | 
| @@ -560,7 +532,6 @@ class TimelineEventRecorder { | 
| Mutex lock_; | 
| uintptr_t async_id_; | 
|  | 
| -  friend class DartTimelineEventIterator; | 
| friend class TimelineEvent; | 
| friend class TimelineEventBlockIterator; | 
| friend class TimelineStream; | 
| @@ -583,16 +554,12 @@ class TimelineEventRingRecorder : public TimelineEventRecorder { | 
| void PrintJSON(JSONStream* js, TimelineEventFilter* filter); | 
| void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter); | 
|  | 
| -  void AppendDartEvent(Isolate* isolate, const char* event); | 
| - | 
| protected: | 
| TimelineEvent* StartEvent(); | 
| void CompleteEvent(TimelineEvent* event); | 
| TimelineEventBlock* GetHeadBlockLocked(); | 
| intptr_t FindOldestBlockIndex() const; | 
| -  TimelineEventBlock* GetNewBlockLocked(Isolate* isolate); | 
| -  intptr_t NumDartEventsLocked(); | 
| -  DartTimelineEvent* DartEventAtLocked(intptr_t i); | 
| +  TimelineEventBlock* GetNewBlockLocked(); | 
|  | 
| void PrintJSONEvents(JSONArray* array, TimelineEventFilter* filter) const; | 
|  | 
| @@ -600,10 +567,6 @@ class TimelineEventRingRecorder : public TimelineEventRecorder { | 
| intptr_t capacity_; | 
| intptr_t num_blocks_; | 
| intptr_t block_cursor_; | 
| - | 
| -  DartTimelineEvent** dart_events_; | 
| -  intptr_t dart_events_capacity_; | 
| -  intptr_t dart_events_cursor_; | 
| }; | 
|  | 
|  | 
| @@ -616,22 +579,17 @@ class TimelineEventStreamingRecorder : public TimelineEventRecorder { | 
| void PrintJSON(JSONStream* js, TimelineEventFilter* filter); | 
| void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter); | 
|  | 
| -  void AppendDartEvent(Isolate* isolate, const char* event); | 
| - | 
| // 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. | 
| virtual void StreamEvent(TimelineEvent* event) = 0; | 
| -  virtual void StreamDartEvent(const char* event) = 0; | 
|  | 
| protected: | 
| -  TimelineEventBlock* GetNewBlockLocked(Isolate* isolate) { | 
| +  TimelineEventBlock* GetNewBlockLocked() { | 
| return NULL; | 
| } | 
| TimelineEventBlock* GetHeadBlockLocked() { | 
| return NULL; | 
| } | 
| -  intptr_t NumDartEventsLocked(); | 
| -  DartTimelineEvent* DartEventAtLocked(intptr_t i); | 
| TimelineEvent* StartEvent(); | 
| void CompleteEvent(TimelineEvent* event); | 
| }; | 
| @@ -647,15 +605,11 @@ class TimelineEventEndlessRecorder : public TimelineEventRecorder { | 
| void PrintJSON(JSONStream* js, TimelineEventFilter* filter); | 
| void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter); | 
|  | 
| -  void AppendDartEvent(Isolate* isolate, const char* event); | 
| - | 
| protected: | 
| TimelineEvent* StartEvent(); | 
| void CompleteEvent(TimelineEvent* event); | 
| -  TimelineEventBlock* GetNewBlockLocked(Isolate* isolate); | 
| +  TimelineEventBlock* GetNewBlockLocked(); | 
| TimelineEventBlock* GetHeadBlockLocked(); | 
| -  intptr_t NumDartEventsLocked(); | 
| -  DartTimelineEvent* DartEventAtLocked(intptr_t i); | 
|  | 
| void PrintJSONEvents(JSONArray* array, TimelineEventFilter* filter) const; | 
|  | 
| @@ -665,10 +619,6 @@ class TimelineEventEndlessRecorder : public TimelineEventRecorder { | 
| TimelineEventBlock* head_; | 
| intptr_t block_index_; | 
|  | 
| -  DartTimelineEvent** dart_events_; | 
| -  intptr_t dart_events_capacity_; | 
| -  intptr_t dart_events_cursor_; | 
| - | 
| friend class TimelineTestHelper; | 
| }; | 
|  | 
| @@ -693,32 +643,6 @@ class TimelineEventBlockIterator { | 
| }; | 
|  | 
|  | 
| -// An iterator for timeline events. | 
| -class DartTimelineEventIterator { | 
| - public: | 
| -  explicit DartTimelineEventIterator(TimelineEventRecorder* recorder); | 
| -  ~DartTimelineEventIterator(); | 
| - | 
| -  void Reset(TimelineEventRecorder* recorder); | 
| - | 
| -  // Returns true if there is another event. | 
| -  bool HasNext() const; | 
| - | 
| -  // Returns the next event and moves forward. | 
| -  DartTimelineEvent* Next(); | 
| - | 
| -  // Returns a zone allocated string of all trace events for isolate. | 
| -  // If isolate is NULL, all isolates' events will be included. | 
| -  static const char* PrintTraceEvents(TimelineEventRecorder* recorder, | 
| -                                      Zone* zone, | 
| -                                      Isolate* isolate); | 
| - | 
| - private: | 
| -  intptr_t cursor_; | 
| -  intptr_t num_events_; | 
| -  TimelineEventRecorder* recorder_; | 
| -}; | 
| - | 
| }  // namespace dart | 
|  | 
| #endif  // VM_TIMELINE_H_ | 
|  |