| 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 |