| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 #include "vm/service_event.h" | 5 #include "vm/service_event.h" |
| 6 | 6 |
| 7 #include "vm/debugger.h" |
| 7 #include "vm/message_handler.h" | 8 #include "vm/message_handler.h" |
| 9 #include "vm/service_isolate.h" |
| 8 | 10 |
| 9 namespace dart { | 11 namespace dart { |
| 10 | 12 |
| 11 #ifndef PRODUCT | 13 #ifndef PRODUCT |
| 12 | 14 |
| 13 // Translate from the legacy DebugEvent to a ServiceEvent. | |
| 14 static ServiceEvent::EventKind TranslateEventKind( | |
| 15 DebuggerEvent::EventType kind) { | |
| 16 switch (kind) { | |
| 17 case DebuggerEvent::kIsolateCreated: | |
| 18 return ServiceEvent::kIsolateStart; | |
| 19 | |
| 20 case DebuggerEvent::kIsolateShutdown: | |
| 21 return ServiceEvent::kIsolateExit; | |
| 22 | |
| 23 case DebuggerEvent::kBreakpointReached: | |
| 24 return ServiceEvent::kPauseBreakpoint; | |
| 25 | |
| 26 case DebuggerEvent::kIsolateInterrupted: | |
| 27 return ServiceEvent::kPauseInterrupted; | |
| 28 | |
| 29 case DebuggerEvent::kExceptionThrown: | |
| 30 return ServiceEvent::kPauseException; | |
| 31 default: | |
| 32 UNREACHABLE(); | |
| 33 return ServiceEvent::kIllegal; | |
| 34 } | |
| 35 } | |
| 36 | |
| 37 | |
| 38 ServiceEvent::ServiceEvent(Isolate* isolate, EventKind event_kind) | 15 ServiceEvent::ServiceEvent(Isolate* isolate, EventKind event_kind) |
| 39 : isolate_(isolate), | 16 : isolate_(isolate), |
| 40 kind_(event_kind), | 17 kind_(event_kind), |
| 41 embedder_kind_(NULL), | 18 embedder_kind_(NULL), |
| 42 embedder_stream_id_(NULL), | 19 embedder_stream_id_(NULL), |
| 43 breakpoint_(NULL), | 20 breakpoint_(NULL), |
| 44 top_frame_(NULL), | 21 top_frame_(NULL), |
| 45 timeline_event_block_(NULL), | 22 timeline_event_block_(NULL), |
| 46 extension_rpc_(NULL), | 23 extension_rpc_(NULL), |
| 47 exception_(NULL), | 24 exception_(NULL), |
| 48 at_async_jump_(false), | 25 at_async_jump_(false), |
| 49 inspectee_(NULL), | 26 inspectee_(NULL), |
| 50 gc_stats_(NULL), | 27 gc_stats_(NULL), |
| 51 bytes_(NULL), | 28 bytes_(NULL), |
| 52 bytes_length_(0), | 29 bytes_length_(0), |
| 53 timestamp_(OS::GetCurrentTimeMillis()) { | 30 timestamp_(OS::GetCurrentTimeMillis()) { |
| 31 // We should never generate events for the vm or service isolates. |
| 32 ASSERT(isolate_ != Dart::vm_isolate()); |
| 33 ASSERT(isolate == NULL || |
| 34 !ServiceIsolate::IsServiceIsolateDescendant(isolate_)); |
| 35 |
| 54 if ((event_kind == ServiceEvent::kPauseStart) && | 36 if ((event_kind == ServiceEvent::kPauseStart) && |
| 55 !isolate->message_handler()->is_paused_on_start()) { | 37 !isolate->message_handler()->is_paused_on_start()) { |
| 56 // We will pause on start but the message handler lacks a valid | 38 // We will pause on start but the message handler lacks a valid |
| 57 // paused timestamp because we haven't paused yet. Use the current time. | 39 // paused timestamp because we haven't paused yet. Use the current time. |
| 58 timestamp_ = OS::GetCurrentTimeMillis(); | 40 timestamp_ = OS::GetCurrentTimeMillis(); |
| 59 } else if ((event_kind == ServiceEvent::kPauseStart) || | 41 } else if ((event_kind == ServiceEvent::kPauseStart) || |
| 60 (event_kind == ServiceEvent::kPauseExit)) { | 42 (event_kind == ServiceEvent::kPauseExit)) { |
| 61 timestamp_ = isolate->message_handler()->paused_timestamp(); | 43 timestamp_ = isolate->message_handler()->paused_timestamp(); |
| 62 } else if (event_kind == ServiceEvent::kResume) { | 44 } else if (event_kind == ServiceEvent::kResume) { |
| 63 timestamp_ = isolate->last_resume_timestamp(); | 45 timestamp_ = isolate->last_resume_timestamp(); |
| 64 } | 46 } |
| 65 } | 47 } |
| 66 | 48 |
| 67 | 49 |
| 68 ServiceEvent::ServiceEvent(const DebuggerEvent* debugger_event) | 50 void ServiceEvent::UpdateTimestamp() { |
| 69 : isolate_(debugger_event->isolate()), | 51 timestamp_ = OS::GetCurrentTimeMillis(); |
| 70 kind_(TranslateEventKind(debugger_event->type())), | |
| 71 breakpoint_(NULL), | |
| 72 top_frame_(NULL), | |
| 73 timeline_event_block_(NULL), | |
| 74 extension_rpc_(NULL), | |
| 75 exception_(NULL), | |
| 76 at_async_jump_(false), | |
| 77 inspectee_(NULL), | |
| 78 gc_stats_(NULL), | |
| 79 bytes_(NULL), | |
| 80 bytes_length_(0), | |
| 81 timestamp_(OS::GetCurrentTimeMillis()) { | |
| 82 DebuggerEvent::EventType type = debugger_event->type(); | |
| 83 if (type == DebuggerEvent::kBreakpointReached) { | |
| 84 set_breakpoint(debugger_event->breakpoint()); | |
| 85 set_at_async_jump(debugger_event->at_async_jump()); | |
| 86 } | |
| 87 if (type == DebuggerEvent::kExceptionThrown) { | |
| 88 set_exception(debugger_event->exception()); | |
| 89 } | |
| 90 if (type == DebuggerEvent::kBreakpointReached || | |
| 91 type == DebuggerEvent::kIsolateInterrupted || | |
| 92 type == DebuggerEvent::kExceptionThrown) { | |
| 93 set_top_frame(debugger_event->top_frame()); | |
| 94 } | |
| 95 if (debugger_event->timestamp() != -1) { | |
| 96 timestamp_ = debugger_event->timestamp(); | |
| 97 } | |
| 98 } | 52 } |
| 99 | 53 |
| 100 | 54 |
| 101 const char* ServiceEvent::KindAsCString() const { | 55 const char* ServiceEvent::KindAsCString() const { |
| 102 switch (kind()) { | 56 switch (kind()) { |
| 103 case kVMUpdate: | 57 case kVMUpdate: |
| 104 return "VMUpdate"; | 58 return "VMUpdate"; |
| 105 case kIsolateStart: | 59 case kIsolateStart: |
| 106 return "IsolateStart"; | 60 return "IsolateStart"; |
| 107 case kIsolateRunnable: | 61 case kIsolateRunnable: |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 return "Extension"; | 102 return "Extension"; |
| 149 case kTimelineEvents: | 103 case kTimelineEvents: |
| 150 return "TimelineEvents"; | 104 return "TimelineEvents"; |
| 151 default: | 105 default: |
| 152 UNREACHABLE(); | 106 UNREACHABLE(); |
| 153 return "Unknown"; | 107 return "Unknown"; |
| 154 } | 108 } |
| 155 } | 109 } |
| 156 | 110 |
| 157 | 111 |
| 158 const char* ServiceEvent::stream_id() const { | 112 const StreamInfo* ServiceEvent::stream_info() const { |
| 159 switch (kind()) { | 113 switch (kind()) { |
| 160 case kVMUpdate: | 114 case kVMUpdate: |
| 161 return Service::vm_stream.id(); | 115 return &Service::vm_stream; |
| 162 | 116 |
| 163 case kIsolateStart: | 117 case kIsolateStart: |
| 164 case kIsolateRunnable: | 118 case kIsolateRunnable: |
| 165 case kIsolateExit: | 119 case kIsolateExit: |
| 166 case kIsolateUpdate: | 120 case kIsolateUpdate: |
| 167 case kServiceExtensionAdded: | 121 case kServiceExtensionAdded: |
| 168 return Service::isolate_stream.id(); | 122 return &Service::isolate_stream; |
| 169 | 123 |
| 170 case kPauseStart: | 124 case kPauseStart: |
| 171 case kPauseExit: | 125 case kPauseExit: |
| 172 case kPauseBreakpoint: | 126 case kPauseBreakpoint: |
| 173 case kPauseInterrupted: | 127 case kPauseInterrupted: |
| 174 case kPauseException: | 128 case kPauseException: |
| 175 case kNone: | 129 case kNone: |
| 176 case kResume: | 130 case kResume: |
| 177 case kBreakpointAdded: | 131 case kBreakpointAdded: |
| 178 case kBreakpointResolved: | 132 case kBreakpointResolved: |
| 179 case kBreakpointRemoved: | 133 case kBreakpointRemoved: |
| 180 case kInspect: | 134 case kInspect: |
| 181 case kDebuggerSettingsUpdate: | 135 case kDebuggerSettingsUpdate: |
| 182 return Service::debug_stream.id(); | 136 return &Service::debug_stream; |
| 183 | 137 |
| 184 case kGC: | 138 case kGC: |
| 185 return Service::gc_stream.id(); | 139 return &Service::gc_stream; |
| 140 |
| 141 case kLogging: |
| 142 return &Service::logging_stream; |
| 143 |
| 144 case kExtension: |
| 145 return &Service::extension_stream; |
| 146 |
| 147 case kTimelineEvents: |
| 148 return &Service::timeline_stream; |
| 186 | 149 |
| 187 case kEmbedder: | 150 case kEmbedder: |
| 188 return embedder_stream_id_; | 151 return NULL; |
| 189 | |
| 190 case kLogging: | |
| 191 return Service::logging_stream.id(); | |
| 192 | |
| 193 case kExtension: | |
| 194 return Service::extension_stream.id(); | |
| 195 | |
| 196 case kTimelineEvents: | |
| 197 return Service::timeline_stream.id(); | |
| 198 | 152 |
| 199 default: | 153 default: |
| 200 UNREACHABLE(); | 154 UNREACHABLE(); |
| 201 return NULL; | 155 return NULL; |
| 202 } | 156 } |
| 203 } | 157 } |
| 204 | 158 |
| 205 | 159 |
| 160 const char* ServiceEvent::stream_id() const { |
| 161 const StreamInfo* stream = stream_info(); |
| 162 if (stream == NULL) { |
| 163 ASSERT(kind() == kEmbedder); |
| 164 return embedder_stream_id_; |
| 165 } else { |
| 166 return stream->id(); |
| 167 } |
| 168 } |
| 169 |
| 170 |
| 206 void ServiceEvent::PrintJSON(JSONStream* js) const { | 171 void ServiceEvent::PrintJSON(JSONStream* js) const { |
| 207 JSONObject jsobj(js); | 172 JSONObject jsobj(js); |
| 208 PrintJSONHeader(&jsobj); | 173 PrintJSONHeader(&jsobj); |
| 209 if (kind() == kServiceExtensionAdded) { | 174 if (kind() == kServiceExtensionAdded) { |
| 210 ASSERT(extension_rpc_ != NULL); | 175 ASSERT(extension_rpc_ != NULL); |
| 211 jsobj.AddProperty("extensionRPC", extension_rpc_->ToCString()); | 176 jsobj.AddProperty("extensionRPC", extension_rpc_->ToCString()); |
| 212 } | 177 } |
| 213 if (kind() == kPauseBreakpoint) { | 178 if (kind() == kPauseBreakpoint) { |
| 214 JSONArray jsarr(&jsobj, "pauseBreakpoints"); | 179 JSONArray jsarr(&jsobj, "pauseBreakpoints"); |
| 215 // TODO(rmacnak): If we are paused at more than one breakpoint, | 180 // TODO(rmacnak): If we are paused at more than one breakpoint, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 } else { | 249 } else { |
| 285 jsobj->AddProperty("isolate", isolate()); | 250 jsobj->AddProperty("isolate", isolate()); |
| 286 } | 251 } |
| 287 ASSERT(timestamp_ != -1); | 252 ASSERT(timestamp_ != -1); |
| 288 jsobj->AddPropertyTimeMillis("timestamp", timestamp_); | 253 jsobj->AddPropertyTimeMillis("timestamp", timestamp_); |
| 289 } | 254 } |
| 290 | 255 |
| 291 #endif // !PRODUCT | 256 #endif // !PRODUCT |
| 292 | 257 |
| 293 } // namespace dart | 258 } // namespace dart |
| OLD | NEW |