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

Side by Side Diff: mojo/dart/embedder/dart_debugger.cc

Issue 1107803002: Add Observatory to sky dart_controller (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 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 unified diff | Download patch
« no previous file with comments | « mojo/dart/embedder/dart_debugger.h ('k') | mojo/dart/embedder/embedder.gni » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include "mojo/dart/embedder/dart_debugger.h"
6
7 #include "dart/runtime/include/dart_api.h" 6 #include "dart/runtime/include/dart_api.h"
8 #include "dart/runtime/include/dart_debugger_api.h" 7 #include "dart/runtime/include/dart_debugger_api.h"
9 #include "dart/runtime/include/dart_native_api.h" 8 #include "dart/runtime/include/dart_native_api.h"
10 #include "mojo/dart/embedder/dart_debugger.h" 9
11 10
12 namespace mojo { 11 namespace mojo {
13 namespace dart { 12 namespace dart {
14 13
15 void DartDebuggerIsolate::MessageLoop() { 14 void DartDebuggerIsolate::MessageLoop() {
16 MonitorLocker ml(&monitor_); 15 MonitorLocker ml(&monitor_);
17 // Request notification on isolate messages. This allows us to 16 // Request notification on isolate messages. This allows us to
18 // respond to vm service messages while at breakpoint. 17 // respond to vm service messages while at breakpoint.
19 Dart_SetMessageNotifyCallback(DartDebugger::NotifyIsolate); 18 Dart_SetMessageNotifyCallback(DartDebugger::NotifyIsolate);
20 while (true) { 19 while (true) {
(...skipping 17 matching lines...) Expand all
38 intptr_t bp_id, 37 intptr_t bp_id,
39 const Dart_CodeLocation& location) { 38 const Dart_CodeLocation& location) {
40 // Nothing to do here. Service event is dispatched to let Observatory know 39 // Nothing to do here. Service event is dispatched to let Observatory know
41 // that a breakpoint was resolved. 40 // that a breakpoint was resolved.
42 } 41 }
43 42
44 void DartDebugger::PausedEventHandler(Dart_IsolateId isolate_id, 43 void DartDebugger::PausedEventHandler(Dart_IsolateId isolate_id,
45 intptr_t bp_id, 44 intptr_t bp_id,
46 const Dart_CodeLocation& loc) { 45 const Dart_CodeLocation& loc) {
47 Dart_EnterScope(); 46 Dart_EnterScope();
48 DartDebuggerIsolate* debugger_isolate = 47 intptr_t isolate_index = FindIsolateIndexById(isolate_id);
49 FindIsolateById(isolate_id); 48 CHECK(isolate_index != -1);
50 CHECK(debugger_isolate != nullptr); 49 (*isolates_)[isolate_index]->MessageLoop();
51 debugger_isolate->MessageLoop();
52 Dart_ExitScope(); 50 Dart_ExitScope();
53 } 51 }
54 52
55 void DartDebugger::ExceptionThrownHandler(Dart_IsolateId isolate_id, 53 void DartDebugger::ExceptionThrownHandler(Dart_IsolateId isolate_id,
56 Dart_Handle exception, 54 Dart_Handle exception,
57 Dart_StackTrace stack_trace) { 55 Dart_StackTrace stack_trace) {
58 Dart_EnterScope(); 56 Dart_EnterScope();
59 DartDebuggerIsolate* debugger_isolate = 57 intptr_t isolate_index = FindIsolateIndexById(isolate_id);
60 FindIsolateById(isolate_id); 58 CHECK(isolate_index != -1);
61 CHECK(debugger_isolate != nullptr); 59 (*isolates_)[isolate_index]->MessageLoop();
62 debugger_isolate->MessageLoop();
63 Dart_ExitScope(); 60 Dart_ExitScope();
64 } 61 }
65 62
66 void DartDebugger::IsolateEventHandler(Dart_IsolateId isolate_id, 63 void DartDebugger::IsolateEventHandler(Dart_IsolateId isolate_id,
67 Dart_IsolateEvent kind) { 64 Dart_IsolateEvent kind) {
68 Dart_EnterScope(); 65 Dart_EnterScope();
69 if (kind == Dart_IsolateEvent::kCreated) { 66 if (kind == Dart_IsolateEvent::kCreated) {
70 AddIsolate(isolate_id); 67 AddIsolate(isolate_id);
71 } else { 68 } else {
72 DartDebuggerIsolate* debugger_isolate = 69 intptr_t isolate_index = FindIsolateIndexById(isolate_id);
73 FindIsolateById(isolate_id); 70 CHECK(isolate_index != -1);
74 CHECK(debugger_isolate != nullptr);
75 if (kind == Dart_IsolateEvent::kInterrupted) { 71 if (kind == Dart_IsolateEvent::kInterrupted) {
76 debugger_isolate->MessageLoop(); 72 (*isolates_)[isolate_index]->MessageLoop();
77 } else { 73 } else {
78 CHECK(kind == Dart_IsolateEvent::kShutdown); 74 CHECK(kind == Dart_IsolateEvent::kShutdown);
79 RemoveIsolate(isolate_id); 75 RemoveIsolate(isolate_id);
80 } 76 }
81 } 77 }
82 Dart_ExitScope(); 78 Dart_ExitScope();
83 } 79 }
84 80
85 void DartDebugger::NotifyIsolate(Dart_Isolate isolate) { 81 void DartDebugger::NotifyIsolate(Dart_Isolate isolate) {
86 base::AutoLock al(*lock_); 82 base::AutoLock al(*lock_);
87 Dart_IsolateId isolate_id = Dart_GetIsolateId(isolate); 83 Dart_IsolateId isolate_id = Dart_GetIsolateId(isolate);
88 DartDebuggerIsolate* debugger_isolate = 84 intptr_t isolate_index = FindIsolateIndexByIdLocked(isolate_id);
89 FindIsolateByIdLocked(isolate_id); 85 if (isolate_index >= 0) {
90 if (debugger_isolate != nullptr) { 86 (*isolates_)[isolate_index]->Notify();
91 debugger_isolate->Notify();
92 } 87 }
93 } 88 }
94 89
95 void DartDebugger::InitDebugger() { 90 void DartDebugger::InitDebugger() {
96 Dart_SetIsolateEventHandler(IsolateEventHandler); 91 Dart_SetIsolateEventHandler(IsolateEventHandler);
97 Dart_SetPausedEventHandler(PausedEventHandler); 92 Dart_SetPausedEventHandler(PausedEventHandler);
98 Dart_SetBreakpointResolvedHandler(BptResolvedHandler); 93 Dart_SetBreakpointResolvedHandler(BptResolvedHandler);
99 Dart_SetExceptionThrownHandler(ExceptionThrownHandler); 94 Dart_SetExceptionThrownHandler(ExceptionThrownHandler);
100 lock_ = new base::Lock(); 95 lock_ = new base::Lock();
96 isolates_ = new std::vector<std::unique_ptr<DartDebuggerIsolate>>();
101 } 97 }
102 98
103 DartDebuggerIsolate* DartDebugger::FindIsolateById(Dart_IsolateId id) { 99 intptr_t DartDebugger::FindIsolateIndexById(Dart_IsolateId id) {
104 base::AutoLock al(*lock_); 100 base::AutoLock al(*lock_);
105 return FindIsolateByIdLocked(id); 101 return FindIsolateIndexByIdLocked(id);
106 } 102 }
107 103
108 DartDebuggerIsolate* DartDebugger::FindIsolateByIdLocked( 104 intptr_t DartDebugger::FindIsolateIndexByIdLocked(
109 Dart_IsolateId id) { 105 Dart_IsolateId id) {
110 lock_->AssertAcquired(); 106 lock_->AssertAcquired();
111 for (size_t i = 0; i < isolates_.size(); i++) { 107 for (size_t i = 0; i < isolates_->size(); i++) {
112 DartDebuggerIsolate* isolate = isolates_[i]; 108 if ((*isolates_)[i]->id() == id) {
113 if (id == isolate->id()) { 109 return i;
114 return isolate;
115 } 110 }
116 } 111 }
117 return nullptr; 112 return -1;
118 } 113 }
119 114
120 DartDebuggerIsolate* DartDebugger::AddIsolate(Dart_IsolateId id) { 115 void DartDebugger::AddIsolate(Dart_IsolateId id) {
121 base::AutoLock al(*lock_); 116 base::AutoLock al(*lock_);
122 CHECK(FindIsolateByIdLocked(id) == nullptr); 117 CHECK(FindIsolateIndexByIdLocked(id) == -1);
123 DartDebuggerIsolate* debugger_isolate = 118 std::unique_ptr<DartDebuggerIsolate> debugger_isolate =
124 new DartDebuggerIsolate(id); 119 std::unique_ptr<DartDebuggerIsolate>(new DartDebuggerIsolate(id));
125 isolates_.push_back(debugger_isolate); 120 isolates_->push_back(std::move(debugger_isolate));
126 return debugger_isolate;
127 } 121 }
128 122
129 void DartDebugger::RemoveIsolate(Dart_IsolateId id) { 123 void DartDebugger::RemoveIsolate(Dart_IsolateId id) {
130 base::AutoLock al(*lock_); 124 base::AutoLock al(*lock_);
131 for (size_t i = 0; i < isolates_.size(); i++) { 125 for (size_t i = 0; i < isolates_->size(); i++) {
132 DartDebuggerIsolate* isolate = isolates_[i]; 126 if (id == (*isolates_)[i]->id()) {
133 if (id == isolate->id()) { 127 isolates_->erase(isolates_->begin() + i);
134 isolates_.erase(isolates_.begin() + i);
135 return; 128 return;
136 } 129 }
137 } 130 }
138 NOTREACHED(); 131 NOTREACHED();
139 } 132 }
140 133
141 base::Lock* DartDebugger::lock_ = nullptr; 134 base::Lock* DartDebugger::lock_ = nullptr;
142 std::vector<DartDebuggerIsolate*> DartDebugger::isolates_; 135 std::vector<std::unique_ptr<DartDebuggerIsolate>>* DartDebugger::isolates_ =
136 nullptr;
143 137
144 } // namespace apps 138 } // namespace dart
145 } // namespace mojo 139 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/dart/embedder/dart_debugger.h ('k') | mojo/dart/embedder/embedder.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698