OLD | NEW |
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/object.h" | 9 #include "vm/object.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 Message::Priority saved_priority; | 125 Message::Priority saved_priority; |
126 bool task_running = true; | 126 bool task_running = true; |
127 { | 127 { |
128 MonitorLocker ml(&monitor_); | 128 MonitorLocker ml(&monitor_); |
129 if (FLAG_trace_isolates) { | 129 if (FLAG_trace_isolates) { |
130 const char* source_name = "<native code>"; | 130 const char* source_name = "<native code>"; |
131 Isolate* source_isolate = Isolate::Current(); | 131 Isolate* source_isolate = Isolate::Current(); |
132 if (source_isolate) { | 132 if (source_isolate) { |
133 source_name = source_isolate->name(); | 133 source_name = source_isolate->name(); |
134 } | 134 } |
135 OS::Print("[>] Posting message:\n" | 135 if (message->type() == Message::kDataType) { |
136 "\tlen: %" Pd "\n" | 136 OS::Print("[>] Posting data message:\n" |
137 "\tsource: %s\n" | 137 "\tlen: %" Pd "\n" |
138 "\tdest: %s\n" | 138 "\tsource: %s\n" |
139 "\tdest_port: %" Pd64 "\n", | 139 "\tdest: %s\n" |
140 message->len(), source_name, name(), message->dest_port()); | 140 "\tdest_port: %" Pd64 "\n", |
| 141 message->len(), source_name, name(), message->dest_port()); |
| 142 } else { |
| 143 ASSERT(message->type() == Message::kIntegerType); |
| 144 OS::Print("[>] Posting integer message:\n" |
| 145 "\tvalue: %" Pd "\n" |
| 146 "\tsource: %s\n" |
| 147 "\tdest: %s\n" |
| 148 "\tdest_port: %" Pd64 "\n", |
| 149 message->integer(), source_name, name(), |
| 150 message->dest_port()); |
| 151 } |
141 } | 152 } |
142 | 153 |
143 saved_priority = message->priority(); | 154 saved_priority = message->priority(); |
144 if (message->IsOOB()) { | 155 if (message->IsOOB()) { |
145 oob_queue_->Enqueue(message, before_events); | 156 oob_queue_->Enqueue(message, before_events); |
146 } else { | 157 } else { |
147 queue_->Enqueue(message, before_events); | 158 queue_->Enqueue(message, before_events); |
148 } | 159 } |
149 message = NULL; // Do not access message. May have been deleted. | 160 message = NULL; // Do not access message. May have been deleted. |
150 | 161 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 193 |
183 // If isolate() returns NULL StartIsolateScope does nothing. | 194 // If isolate() returns NULL StartIsolateScope does nothing. |
184 StartIsolateScope start_isolate(isolate()); | 195 StartIsolateScope start_isolate(isolate()); |
185 | 196 |
186 MessageStatus max_status = kOK; | 197 MessageStatus max_status = kOK; |
187 Message::Priority min_priority = ((allow_normal_messages && !paused()) | 198 Message::Priority min_priority = ((allow_normal_messages && !paused()) |
188 ? Message::kNormalPriority | 199 ? Message::kNormalPriority |
189 : Message::kOOBPriority); | 200 : Message::kOOBPriority); |
190 Message* message = DequeueMessage(min_priority); | 201 Message* message = DequeueMessage(min_priority); |
191 while (message != NULL) { | 202 while (message != NULL) { |
192 intptr_t message_len = message->len(); | |
193 if (FLAG_trace_isolates) { | 203 if (FLAG_trace_isolates) { |
194 OS::Print("[<] Handling message:\n" | 204 if (message->type() == Message::kDataType) { |
195 "\tlen: %" Pd "\n" | 205 OS::Print("[<] Handling data message:\n" |
196 "\thandler: %s\n" | 206 "\tlen: %" Pd "\n" |
197 "\tport: %" Pd64 "\n", | 207 "\thandler: %s\n" |
198 message_len, name(), message->dest_port()); | 208 "\tport: %" Pd64 "\n", |
| 209 message->len(), name(), message->dest_port()); |
| 210 } else { |
| 211 ASSERT(message->type() == Message::kIntegerType); |
| 212 OS::Print("[<] Handling integer message:\n" |
| 213 "\tvalue: %" Pd "\n" |
| 214 "\thandler: %s\n" |
| 215 "\tport: %" Pd64 "\n", |
| 216 message->integer(), name(), message->dest_port()); |
| 217 } |
199 } | 218 } |
200 | 219 |
201 // Release the monitor_ temporarily while we handle the message. | 220 // Release the monitor_ temporarily while we handle the message. |
202 // The monitor was acquired in MessageHandler::TaskCallback(). | 221 // The monitor was acquired in MessageHandler::TaskCallback(). |
203 monitor_.Exit(); | 222 monitor_.Exit(); |
204 Message::Priority saved_priority = message->priority(); | 223 Message::Priority saved_priority = message->priority(); |
205 Dart_Port saved_dest_port = message->dest_port(); | 224 Dart_Port saved_dest_port = message->dest_port(); |
206 MessageStatus status = HandleMessage(message); | 225 MessageStatus status = HandleMessage(message); |
207 if (status > max_status) { | 226 if (status > max_status) { |
208 max_status = status; | 227 max_status = status; |
209 } | 228 } |
210 message = NULL; // May be deleted by now. | 229 message = NULL; // May be deleted by now. |
211 monitor_.Enter(); | 230 monitor_.Enter(); |
212 if (FLAG_trace_isolates) { | 231 if (FLAG_trace_isolates) { |
213 OS::Print("[.] Message handled (%s):\n" | 232 if (message->type() == Message::kDataType) { |
214 "\tlen: %" Pd "\n" | 233 OS::Print("[.] Data message handled (%s):\n" |
215 "\thandler: %s\n" | 234 "\tlen: %" Pd "\n" |
216 "\tport: %" Pd64 "\n", | 235 "\thandler: %s\n" |
217 MessageStatusString(status), | 236 "\tport: %" Pd64 "\n", |
218 message_len, name(), saved_dest_port); | 237 MessageStatusString(status), |
| 238 message->len(), name(), saved_dest_port); |
| 239 } else { |
| 240 ASSERT(message->type() == Message::kIntegerType); |
| 241 OS::Print("[.] Integer message handled (%s):\n" |
| 242 "\tvalue: %" Pd "\n" |
| 243 "\thandler: %s\n" |
| 244 "\tport: %" Pd64 "\n", |
| 245 MessageStatusString(status), |
| 246 message->integer(), name(), saved_dest_port); |
| 247 } |
219 } | 248 } |
220 // If we are shutting down, do not process any more messages. | 249 // If we are shutting down, do not process any more messages. |
221 if (status == kShutdown) { | 250 if (status == kShutdown) { |
222 ClearOOBQueue(); | 251 ClearOOBQueue(); |
223 break; | 252 break; |
224 } | 253 } |
225 | 254 |
226 // Some callers want to process only one normal message and then quit. At | 255 // Some callers want to process only one normal message and then quit. At |
227 // the same time it is OK to process multiple OOB messages. | 256 // the same time it is OK to process multiple OOB messages. |
228 if ((saved_priority == Message::kNormalPriority) && | 257 if ((saved_priority == Message::kNormalPriority) && |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 | 500 |
472 | 501 |
473 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { | 502 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { |
474 ASSERT(acquired_queues != NULL); | 503 ASSERT(acquired_queues != NULL); |
475 // No double dipping. | 504 // No double dipping. |
476 ASSERT(acquired_queues->handler_ == NULL); | 505 ASSERT(acquired_queues->handler_ == NULL); |
477 acquired_queues->Reset(this); | 506 acquired_queues->Reset(this); |
478 } | 507 } |
479 | 508 |
480 } // namespace dart | 509 } // namespace dart |
OLD | NEW |