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
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_SERVICE_EVENT_H_
6#define RUNTIME_VM_SERVICE_EVENT_H_
7
8#include "vm/globals.h"
9#include "vm/heap/heap.h"
10
11namespace dart {
12
13class ActivationFrame;
14class Breakpoint;
15class Instance;
16class Isolate;
17class Object;
18class StreamInfo;
19class String;
20class TimelineEventBlock;
21
22class ServiceEvent {
23 public:
24 enum EventKind {
25 kVMUpdate, // VM identity information has changed
26 kVMFlagUpdate, // VM flags updated
27
28 kIsolateStart, // New isolate has started
29 kIsolateRunnable, // Isolate is ready to run
30 kIsolateExit, // Isolate has exited
31 kIsolateUpdate, // Isolate identity information has changed
32 kIsolateReload, // Result of a reload request
33 kServiceExtensionAdded, // A service extension was registered
34
35 kPauseStart, // --pause-isolates-on-start
36 kPauseExit, // --pause-isolates-on-exit
37 kPauseBreakpoint,
38 kPauseInterrupted,
39 kPauseException,
40 kPausePostRequest, // isolate is paused after a service request.
41 kNone, // isolate has not been made runnable yet.
42 kResume,
43 kBreakpointAdded,
44 kBreakpointResolved,
45 kBreakpointRemoved,
46 kInspect,
47 kDebuggerSettingsUpdate,
48
49 kGC,
50
51 kEmbedder,
52
53 kLogging,
54
55 kExtension,
56
57 kTimelineEvents,
58 // Sent when SetVMTimelineFlags is called.
59 kTimelineStreamSubscriptionsUpdate,
60
61 kIllegal,
62 };
63
64 struct LogRecord {
65 int64_t sequence_number;
66 int64_t timestamp;
67 intptr_t level;
68 const String* name;
69 const String* message;
70 const Instance* zone;
71 const Object* error;
72 const Instance* stack_trace;
73 };
74
75 struct ExtensionEvent {
76 const String* event_kind;
77 const String* event_data;
78 };
79
80 ServiceEvent(Isolate* isolate, EventKind event_kind);
81
82 Isolate* isolate() const { return isolate_; }
83
84 // Used by the C embedding api.
85 Dart_Port isolate_id() const { return isolate_->main_port(); }
86
87 EventKind kind() const { return kind_; }
88
89 bool IsPause() const {
90 switch (kind()) {
91 case kPauseStart:
92 case kPauseExit:
93 case kPauseBreakpoint:
94 case kPauseInterrupted:
95 case kPauseException:
96 case kPausePostRequest:
97 return true;
98 default:
99 return false;
100 }
101 }
102
103 const char* flag_name() const { return flag_name_; }
104 void set_flag_name(const char* flag) { flag_name_ = flag; }
105
106 const char* flag_new_value() const { return flag_new_value_; }
107 void set_flag_new_value(const char* value) { flag_new_value_ = value; }
108
109 const char* embedder_kind() const { return embedder_kind_; }
110
111 const char* KindAsCString() const;
112
113 void set_embedder_kind(const char* embedder_kind) {
114 embedder_kind_ = embedder_kind;
115 }
116
117 const StreamInfo* stream_info() const;
118 const char* stream_id() const;
119
120 void set_embedder_stream_id(const char* stream_id) {
121 embedder_stream_id_ = stream_id;
122 }
123
124 Breakpoint* breakpoint() const { return breakpoint_; }
125 void set_breakpoint(Breakpoint* bpt) {
126 ASSERT(kind() == kPauseBreakpoint || kind() == kBreakpointAdded ||
127 kind() == kBreakpointResolved || kind() == kBreakpointRemoved);
128 breakpoint_ = bpt;
129 }
130
131 ActivationFrame* top_frame() const { return top_frame_; }
132 void set_top_frame(ActivationFrame* frame) {
133 ASSERT(kind() == kPauseBreakpoint || kind() == kPauseInterrupted ||
134 kind() == kPauseException || kind() == kPausePostRequest ||
135 kind() == kResume);
136 top_frame_ = frame;
137 }
138
139 const String* extension_rpc() const { return extension_rpc_; }
140 void set_extension_rpc(const String* extension_rpc) {
141 extension_rpc_ = extension_rpc;
142 }
143
144 const Object* exception() const { return exception_; }
145 void set_exception(const Object* exception) {
146 ASSERT(kind_ == kPauseException);
147 exception_ = exception;
148 }
149
150 const Error* reload_error() const {
151 ASSERT(kind_ == kIsolateReload);
152 return reload_error_;
153 }
154 void set_reload_error(const Error* error) {
155 ASSERT(kind_ == kIsolateReload);
156 reload_error_ = error;
157 }
158
159 bool at_async_jump() const { return at_async_jump_; }
160 void set_at_async_jump(bool value) { at_async_jump_ = value; }
161
162 const Object* inspectee() const { return inspectee_; }
163 void set_inspectee(const Object* inspectee) {
164 ASSERT(kind_ == kInspect);
165 inspectee_ = inspectee;
166 }
167
168 const Heap::GCStats* gc_stats() const { return gc_stats_; }
169
170 void set_gc_stats(const Heap::GCStats* gc_stats) { gc_stats_ = gc_stats; }
171
172 const uint8_t* bytes() const { return bytes_; }
173
174 intptr_t bytes_length() const { return bytes_length_; }
175
176 void set_bytes(const uint8_t* bytes, intptr_t bytes_length) {
177 bytes_ = bytes;
178 bytes_length_ = bytes_length;
179 }
180
181 void set_log_record(const LogRecord& log_record) { log_record_ = log_record; }
182
183 void set_extension_event(const ExtensionEvent& extension_event) {
184 extension_event_ = extension_event;
185 }
186
187 void UpdateTimestamp();
188
189 int64_t timestamp() const { return timestamp_; }
190
191 const TimelineEventBlock* timeline_event_block() const {
192 return timeline_event_block_;
193 }
194
195 void set_timeline_event_block(const TimelineEventBlock* block) {
196 ASSERT(kind() == kTimelineEvents);
197 timeline_event_block_ = block;
198 }
199
200 void PrintJSON(JSONStream* js) const;
201
202 void PrintJSONHeader(JSONObject* jsobj) const;
203
204 private:
205 Isolate* isolate_;
206 EventKind kind_;
207 const char* flag_name_;
208 const char* flag_new_value_;
209 const char* embedder_kind_;
210 const char* embedder_stream_id_;
211 Breakpoint* breakpoint_;
212 ActivationFrame* top_frame_;
213 const TimelineEventBlock* timeline_event_block_;
214 const String* extension_rpc_;
215 const Object* exception_;
216 const Error* reload_error_;
217 const String* spawn_token_;
218 const String* spawn_error_;
219 bool at_async_jump_;
220 const Object* inspectee_;
221 const Heap::GCStats* gc_stats_;
222 const uint8_t* bytes_;
223 intptr_t bytes_length_;
224 LogRecord log_record_;
225 ExtensionEvent extension_event_;
226 int64_t timestamp_;
227};
228
229} // namespace dart
230
231#endif // RUNTIME_VM_SERVICE_EVENT_H_
232