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

Side by Side Diff: runtime/vm/message_handler.cc

Issue 1177153005: Enables clean VM shutdown. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Kill isolates from the service isolate Created 5 years, 5 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
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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/message_handler.h" 5 #include "vm/message_handler.h"
6 6
7 #include "vm/dart.h" 7 #include "vm/dart.h"
8 #include "vm/lockers.h" 8 #include "vm/lockers.h"
9 #include "vm/port.h" 9 #include "vm/port.h"
10 #include "vm/thread_interrupter.h" 10 #include "vm/thread_interrupter.h"
(...skipping 24 matching lines...) Expand all
35 MessageHandler::MessageHandler() 35 MessageHandler::MessageHandler()
36 : queue_(new MessageQueue()), 36 : queue_(new MessageQueue()),
37 oob_queue_(new MessageQueue()), 37 oob_queue_(new MessageQueue()),
38 oob_message_handling_allowed_(true), 38 oob_message_handling_allowed_(true),
39 live_ports_(0), 39 live_ports_(0),
40 paused_(0), 40 paused_(0),
41 pause_on_start_(false), 41 pause_on_start_(false),
42 pause_on_exit_(false), 42 pause_on_exit_(false),
43 paused_on_start_(false), 43 paused_on_start_(false),
44 paused_on_exit_(false), 44 paused_on_exit_(false),
45 pool_(NULL), 45 running_(false),
46 task_(NULL), 46 task_(NULL),
47 start_callback_(NULL), 47 start_callback_(NULL),
48 end_callback_(NULL), 48 end_callback_(NULL),
49 callback_data_(0) { 49 callback_data_(0) {
50 ASSERT(queue_ != NULL); 50 ASSERT(queue_ != NULL);
51 ASSERT(oob_queue_ != NULL); 51 ASSERT(oob_queue_ != NULL);
52 } 52 }
53 53
54 54
55 MessageHandler::~MessageHandler() { 55 MessageHandler::~MessageHandler() {
(...skipping 12 matching lines...) Expand all
68 // By default there is no checking. 68 // By default there is no checking.
69 } 69 }
70 #endif 70 #endif
71 71
72 72
73 void MessageHandler::MessageNotify(Message::Priority priority) { 73 void MessageHandler::MessageNotify(Message::Priority priority) {
74 // By default, there is no custom message notification. 74 // By default, there is no custom message notification.
75 } 75 }
76 76
77 77
78 void MessageHandler::Run(ThreadPool* pool, 78 void MessageHandler::Run(StartCallback start_callback,
79 StartCallback start_callback,
80 EndCallback end_callback, 79 EndCallback end_callback,
81 CallbackData data) { 80 CallbackData data) {
82 MonitorLocker ml(&monitor_); 81 MonitorLocker ml(&monitor_);
83 if (FLAG_trace_isolates) { 82 if (FLAG_trace_isolates) {
84 OS::Print("[+] Starting message handler:\n" 83 OS::Print("[+] Starting message handler:\n"
85 "\thandler: %s\n", 84 "\thandler: %s\n",
86 name()); 85 name());
87 } 86 }
88 ASSERT(pool_ == NULL); 87 ASSERT(!running_);
89 pool_ = pool; 88 running_ = true;
turnidge 2015/06/30 22:15:46 I think that "running_" is a bit confusing as a na
zra 2015/07/20 22:23:39 Done.
90 start_callback_ = start_callback; 89 start_callback_ = start_callback;
91 end_callback_ = end_callback; 90 end_callback_ = end_callback;
92 callback_data_ = data; 91 callback_data_ = data;
93 task_ = new MessageHandlerTask(this); 92 task_ = new MessageHandlerTask(this);
94 pool_->Run(task_); 93 ThreadPool::Run(task_);
95 } 94 }
96 95
97 96
98 void MessageHandler::PostMessage(Message* message, bool before_events) { 97 void MessageHandler::PostMessage(Message* message, bool before_events) {
99 Message::Priority saved_priority; 98 Message::Priority saved_priority;
100 { 99 {
101 MonitorLocker ml(&monitor_); 100 MonitorLocker ml(&monitor_);
102 if (FLAG_trace_isolates) { 101 if (FLAG_trace_isolates) {
103 const char* source_name = "<native code>"; 102 const char* source_name = "<native code>";
104 Isolate* source_isolate = Isolate::Current(); 103 Isolate* source_isolate = Isolate::Current();
105 if (source_isolate) { 104 if (source_isolate) {
106 source_name = source_isolate->name(); 105 source_name = source_isolate->name();
107 } 106 }
108 OS::Print("[>] Posting message:\n" 107 OS::Print("[>] Posting message:\n"
109 "\tlen: %" Pd "\n" 108 "\tlen: %" Pd "\n"
110 "\tsource: %s\n" 109 "\tsource: %s\n"
111 "\tdest: %s\n" 110 "\tdest: %s\n"
112 "\tdest_port: %" Pd64 "\n", 111 "\tdest_port: %" Pd64 "\n",
113 message->len(), source_name, name(), message->dest_port()); 112 message->len(), source_name, name(), message->dest_port());
114 } 113 }
115 114
116 saved_priority = message->priority(); 115 saved_priority = message->priority();
117 if (message->IsOOB()) { 116 if (message->IsOOB()) {
118 oob_queue_->Enqueue(message, before_events); 117 oob_queue_->Enqueue(message, before_events);
119 } else { 118 } else {
120 queue_->Enqueue(message, before_events); 119 queue_->Enqueue(message, before_events);
121 } 120 }
122 message = NULL; // Do not access message. May have been deleted. 121 message = NULL; // Do not access message. May have been deleted.
123 122
124 if (pool_ != NULL && task_ == NULL) { 123 if (running_ && task_ == NULL) {
125 task_ = new MessageHandlerTask(this); 124 task_ = new MessageHandlerTask(this);
126 pool_->Run(task_); 125 ThreadPool::Run(task_);
127 } 126 }
128 } 127 }
129 // Invoke any custom message notification. 128 // Invoke any custom message notification.
130 MessageNotify(saved_priority); 129 MessageNotify(saved_priority);
131 } 130 }
132 131
133 132
134 Message* MessageHandler::DequeueMessage(Message::Priority min_priority) { 133 Message* MessageHandler::DequeueMessage(Message::Priority min_priority) {
135 // TODO(turnidge): Add assert that monitor_ is held here. 134 // TODO(turnidge): Add assert that monitor_ is held here.
136 Message* message = oob_queue_->Dequeue(); 135 Message* message = oob_queue_->Dequeue();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 min_priority = (allow_normal_messages && !paused()) ? 195 min_priority = (allow_normal_messages && !paused()) ?
197 Message::kNormalPriority : Message::kOOBPriority; 196 Message::kNormalPriority : Message::kOOBPriority;
198 message = DequeueMessage(min_priority); 197 message = DequeueMessage(min_priority);
199 } 198 }
200 return result; 199 return result;
201 } 200 }
202 201
203 202
204 bool MessageHandler::HandleNextMessage() { 203 bool MessageHandler::HandleNextMessage() {
205 // We can only call HandleNextMessage when this handler is not 204 // We can only call HandleNextMessage when this handler is not
206 // assigned to a thread pool. 205 // assigned to a thread pool.
turnidge 2015/06/30 22:15:46 Update comment.
zra 2015/07/20 22:23:39 Done.
207 MonitorLocker ml(&monitor_); 206 MonitorLocker ml(&monitor_);
208 ASSERT(pool_ == NULL); 207 ASSERT(!running_);
209 #if defined(DEBUG) 208 #if defined(DEBUG)
210 CheckAccess(); 209 CheckAccess();
211 #endif 210 #endif
212 return HandleMessages(true, false); 211 return HandleMessages(true, false);
213 } 212 }
214 213
215 214
216 bool MessageHandler::HandleOOBMessages() { 215 bool MessageHandler::HandleOOBMessages() {
217 if (!oob_message_handling_allowed_) { 216 if (!oob_message_handling_allowed_) {
218 return true; 217 return true;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 NotifyPauseOnExit(); 280 NotifyPauseOnExit();
282 paused_on_exit_ = true; 281 paused_on_exit_ = true;
283 } 282 }
284 } else { 283 } else {
285 if (FLAG_trace_isolates) { 284 if (FLAG_trace_isolates) {
286 OS::Print("[-] Stopping message handler (%s):\n" 285 OS::Print("[-] Stopping message handler (%s):\n"
287 "\thandler: %s\n", 286 "\thandler: %s\n",
288 (ok ? "no live ports" : "error"), 287 (ok ? "no live ports" : "error"),
289 name()); 288 name());
290 } 289 }
291 pool_ = NULL; 290 running_ = false;
292 run_end_callback = true; 291 run_end_callback = true;
293 paused_on_exit_ = false; 292 paused_on_exit_ = false;
294 } 293 }
295 } 294 }
296 } 295 }
297 if (run_end_callback && end_callback_ != NULL) { 296 if (run_end_callback && end_callback_ != NULL) {
298 end_callback_(callback_data_); 297 end_callback_(callback_data_);
299 // The handler may have been deleted after this point. 298 // The handler may have been deleted after this point.
300 } 299 }
301 } 300 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 370
372 371
373 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { 372 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) {
374 ASSERT(acquired_queues != NULL); 373 ASSERT(acquired_queues != NULL);
375 // No double dipping. 374 // No double dipping.
376 ASSERT(acquired_queues->handler_ == NULL); 375 ASSERT(acquired_queues->handler_ == NULL);
377 acquired_queues->Reset(this); 376 acquired_queues->Reset(this);
378 } 377 }
379 378
380 } // namespace dart 379 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698