| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/isolate.h" | 5 #include "vm/isolate.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/text_buffer.h" | 10 #include "platform/text_buffer.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 200 |
| 201 | 201 |
| 202 class IsolateMessageHandler : public MessageHandler { | 202 class IsolateMessageHandler : public MessageHandler { |
| 203 public: | 203 public: |
| 204 explicit IsolateMessageHandler(Isolate* isolate); | 204 explicit IsolateMessageHandler(Isolate* isolate); |
| 205 ~IsolateMessageHandler(); | 205 ~IsolateMessageHandler(); |
| 206 | 206 |
| 207 const char* name() const; | 207 const char* name() const; |
| 208 void MessageNotify(Message::Priority priority); | 208 void MessageNotify(Message::Priority priority); |
| 209 MessageStatus HandleMessage(Message* message); | 209 MessageStatus HandleMessage(Message* message); |
| 210 #ifndef PRODUCT |
| 210 void NotifyPauseOnStart(); | 211 void NotifyPauseOnStart(); |
| 211 void NotifyPauseOnExit(); | 212 void NotifyPauseOnExit(); |
| 213 #endif // !PRODUCT |
| 212 | 214 |
| 213 #if defined(DEBUG) | 215 #if defined(DEBUG) |
| 214 // Check that it is safe to access this handler. | 216 // Check that it is safe to access this handler. |
| 215 void CheckAccess(); | 217 void CheckAccess(); |
| 216 #endif | 218 #endif |
| 217 bool IsCurrentIsolate() const; | 219 bool IsCurrentIsolate() const; |
| 218 virtual Isolate* isolate() const { return isolate_; } | 220 virtual Isolate* isolate() const { return isolate_; } |
| 219 | 221 |
| 220 private: | 222 private: |
| 221 // A result of false indicates that the isolate should terminate the | 223 // A result of false indicates that the isolate should terminate the |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 } else { | 570 } else { |
| 569 const Object& result = Object::Handle(zone, | 571 const Object& result = Object::Handle(zone, |
| 570 DartLibraryCalls::HandleMessage(msg_handler, msg)); | 572 DartLibraryCalls::HandleMessage(msg_handler, msg)); |
| 571 if (result.IsError()) { | 573 if (result.IsError()) { |
| 572 status = ProcessUnhandledException(Error::Cast(result)); | 574 status = ProcessUnhandledException(Error::Cast(result)); |
| 573 } else { | 575 } else { |
| 574 ASSERT(result.IsNull()); | 576 ASSERT(result.IsNull()); |
| 575 } | 577 } |
| 576 } | 578 } |
| 577 delete message; | 579 delete message; |
| 580 #ifndef PRODUCT |
| 578 if (status == kOK) { | 581 if (status == kOK) { |
| 579 const Object& result = | 582 const Object& result = |
| 580 Object::Handle(zone, I->InvokePendingServiceExtensionCalls()); | 583 Object::Handle(zone, I->InvokePendingServiceExtensionCalls()); |
| 581 if (result.IsError()) { | 584 if (result.IsError()) { |
| 582 status = ProcessUnhandledException(Error::Cast(result)); | 585 status = ProcessUnhandledException(Error::Cast(result)); |
| 583 } else { | 586 } else { |
| 584 ASSERT(result.IsNull()); | 587 ASSERT(result.IsNull()); |
| 585 } | 588 } |
| 586 } | 589 } |
| 590 #endif // !PRODUCT |
| 587 return status; | 591 return status; |
| 588 } | 592 } |
| 589 | 593 |
| 590 | 594 |
| 595 #ifndef PRODUCT |
| 591 void IsolateMessageHandler::NotifyPauseOnStart() { | 596 void IsolateMessageHandler::NotifyPauseOnStart() { |
| 592 if (!FLAG_support_service) { | 597 if (!FLAG_support_service) { |
| 593 return; | 598 return; |
| 594 } | 599 } |
| 595 if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) { | 600 if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) { |
| 596 StartIsolateScope start_isolate(I); | 601 StartIsolateScope start_isolate(I); |
| 597 StackZone zone(T); | 602 StackZone zone(T); |
| 598 HandleScope handle_scope(T); | 603 HandleScope handle_scope(T); |
| 599 ServiceEvent pause_event(I, ServiceEvent::kPauseStart); | 604 ServiceEvent pause_event(I, ServiceEvent::kPauseStart); |
| 600 Service::HandleEvent(&pause_event); | 605 Service::HandleEvent(&pause_event); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 613 StartIsolateScope start_isolate(I); | 618 StartIsolateScope start_isolate(I); |
| 614 StackZone zone(T); | 619 StackZone zone(T); |
| 615 HandleScope handle_scope(T); | 620 HandleScope handle_scope(T); |
| 616 ServiceEvent pause_event(I, ServiceEvent::kPauseExit); | 621 ServiceEvent pause_event(I, ServiceEvent::kPauseExit); |
| 617 Service::HandleEvent(&pause_event); | 622 Service::HandleEvent(&pause_event); |
| 618 } else if (FLAG_trace_service) { | 623 } else if (FLAG_trace_service) { |
| 619 OS::Print("vm-service: Dropping event of type PauseExit (%s)\n", | 624 OS::Print("vm-service: Dropping event of type PauseExit (%s)\n", |
| 620 I->name()); | 625 I->name()); |
| 621 } | 626 } |
| 622 } | 627 } |
| 628 #endif // !PRODUCT |
| 623 | 629 |
| 624 | 630 |
| 625 #if defined(DEBUG) | 631 #if defined(DEBUG) |
| 626 void IsolateMessageHandler::CheckAccess() { | 632 void IsolateMessageHandler::CheckAccess() { |
| 627 ASSERT(IsCurrentIsolate()); | 633 ASSERT(IsCurrentIsolate()); |
| 628 } | 634 } |
| 629 #endif | 635 #endif |
| 630 | 636 |
| 631 | 637 |
| 632 bool IsolateMessageHandler::IsCurrentIsolate() const { | 638 bool IsolateMessageHandler::IsCurrentIsolate() const { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 result->debugger_ = new Debugger(); | 959 result->debugger_ = new Debugger(); |
| 954 result->debugger_->Initialize(result); | 960 result->debugger_->Initialize(result); |
| 955 } | 961 } |
| 956 if (FLAG_trace_isolates) { | 962 if (FLAG_trace_isolates) { |
| 957 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { | 963 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { |
| 958 OS::Print("[+] Starting isolate:\n" | 964 OS::Print("[+] Starting isolate:\n" |
| 959 "\tisolate: %s\n", result->name()); | 965 "\tisolate: %s\n", result->name()); |
| 960 } | 966 } |
| 961 } | 967 } |
| 962 | 968 |
| 969 #ifndef PRODUCT |
| 963 if (FLAG_support_service) { | 970 if (FLAG_support_service) { |
| 964 ObjectIdRing::Init(result); | 971 ObjectIdRing::Init(result); |
| 965 } | 972 } |
| 973 #endif // !PRODUCT |
| 966 | 974 |
| 967 // Add to isolate list. Shutdown and delete the isolate on failure. | 975 // Add to isolate list. Shutdown and delete the isolate on failure. |
| 968 if (!AddIsolateToList(result)) { | 976 if (!AddIsolateToList(result)) { |
| 969 result->LowLevelShutdown(); | 977 result->LowLevelShutdown(); |
| 970 Thread::ExitIsolate(); | 978 Thread::ExitIsolate(); |
| 971 delete result; | 979 delete result; |
| 972 return NULL; | 980 return NULL; |
| 973 } | 981 } |
| 974 | 982 |
| 975 return result; | 983 return result; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 reload_context_ = NULL; | 1084 reload_context_ = NULL; |
| 1077 } | 1085 } |
| 1078 | 1086 |
| 1079 | 1087 |
| 1080 void Isolate::ReloadSources(bool test_mode) { | 1088 void Isolate::ReloadSources(bool test_mode) { |
| 1081 ASSERT(!IsReloading()); | 1089 ASSERT(!IsReloading()); |
| 1082 has_attempted_reload_ = true; | 1090 has_attempted_reload_ = true; |
| 1083 reload_context_ = new IsolateReloadContext(this, test_mode); | 1091 reload_context_ = new IsolateReloadContext(this, test_mode); |
| 1084 reload_context_->StartReload(); | 1092 reload_context_->StartReload(); |
| 1085 } | 1093 } |
| 1086 | 1094 #endif // !PRODUCT |
| 1087 #endif | |
| 1088 | 1095 |
| 1089 | 1096 |
| 1090 void Isolate::DoneFinalizing() { | 1097 void Isolate::DoneFinalizing() { |
| 1091 NOT_IN_PRODUCT( | 1098 NOT_IN_PRODUCT( |
| 1092 if (IsReloading()) { | 1099 if (IsReloading()) { |
| 1093 reload_context_->FinishReload(); | 1100 reload_context_->FinishReload(); |
| 1094 if (reload_context_->has_error() && reload_context_->test_mode()) { | 1101 if (reload_context_->has_error() && reload_context_->test_mode()) { |
| 1095 // If the reload has an error and we are in test mode keep the reload | 1102 // If the reload has an error and we are in test mode keep the reload |
| 1096 // context on the isolate so that it can be used by unit tests. | 1103 // context on the isolate so that it can be used by unit tests. |
| 1097 return; | 1104 return; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 #ifndef PRODUCT | 1143 #ifndef PRODUCT |
| 1137 if (FLAG_support_timeline) { | 1144 if (FLAG_support_timeline) { |
| 1138 TimelineStream* stream = Timeline::GetIsolateStream(); | 1145 TimelineStream* stream = Timeline::GetIsolateStream(); |
| 1139 ASSERT(stream != NULL); | 1146 ASSERT(stream != NULL); |
| 1140 TimelineEvent* event = stream->StartEvent(); | 1147 TimelineEvent* event = stream->StartEvent(); |
| 1141 if (event != NULL) { | 1148 if (event != NULL) { |
| 1142 event->Instant("Runnable"); | 1149 event->Instant("Runnable"); |
| 1143 event->Complete(); | 1150 event->Complete(); |
| 1144 } | 1151 } |
| 1145 } | 1152 } |
| 1146 #endif // !PRODUCT | |
| 1147 if (FLAG_support_service && Service::isolate_stream.enabled()) { | 1153 if (FLAG_support_service && Service::isolate_stream.enabled()) { |
| 1148 ServiceEvent runnableEvent(this, ServiceEvent::kIsolateRunnable); | 1154 ServiceEvent runnableEvent(this, ServiceEvent::kIsolateRunnable); |
| 1149 Service::HandleEvent(&runnableEvent); | 1155 Service::HandleEvent(&runnableEvent); |
| 1150 } | 1156 } |
| 1157 #endif // !PRODUCT |
| 1151 return true; | 1158 return true; |
| 1152 } | 1159 } |
| 1153 | 1160 |
| 1154 | 1161 |
| 1155 bool Isolate::VerifyPauseCapability(const Object& capability) const { | 1162 bool Isolate::VerifyPauseCapability(const Object& capability) const { |
| 1156 return !capability.IsNull() && | 1163 return !capability.IsNull() && |
| 1157 capability.IsCapability() && | 1164 capability.IsCapability() && |
| 1158 (pause_capability() == Capability::Cast(capability).Id()); | 1165 (pause_capability() == Capability::Cast(capability).Id()); |
| 1159 } | 1166 } |
| 1160 | 1167 |
| (...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 } | 2102 } |
| 2096 const GrowableObjectArray& array = | 2103 const GrowableObjectArray& array = |
| 2097 GrowableObjectArray::Handle(boxed_field_list_); | 2104 GrowableObjectArray::Handle(boxed_field_list_); |
| 2098 if (array.Length() == 0) { | 2105 if (array.Length() == 0) { |
| 2099 return Field::null(); | 2106 return Field::null(); |
| 2100 } | 2107 } |
| 2101 return Field::RawCast(array.RemoveLast()); | 2108 return Field::RawCast(array.RemoveLast()); |
| 2102 } | 2109 } |
| 2103 | 2110 |
| 2104 | 2111 |
| 2112 #ifndef PRODUCT |
| 2105 RawObject* Isolate::InvokePendingServiceExtensionCalls() { | 2113 RawObject* Isolate::InvokePendingServiceExtensionCalls() { |
| 2106 if (!FLAG_support_service) { | 2114 if (!FLAG_support_service) { |
| 2107 return Object::null(); | 2115 return Object::null(); |
| 2108 } | 2116 } |
| 2109 GrowableObjectArray& calls = | 2117 GrowableObjectArray& calls = |
| 2110 GrowableObjectArray::Handle(GetAndClearPendingServiceExtensionCalls()); | 2118 GrowableObjectArray::Handle(GetAndClearPendingServiceExtensionCalls()); |
| 2111 if (calls.IsNull()) { | 2119 if (calls.IsNull()) { |
| 2112 return Object::null(); | 2120 return Object::null(); |
| 2113 } | 2121 } |
| 2114 // Grab run function. | 2122 // Grab run function. |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2275 String& handler_name = String::Handle(); | 2283 String& handler_name = String::Handle(); |
| 2276 for (intptr_t i = 0; i < handlers.Length(); i += kRegisteredEntrySize) { | 2284 for (intptr_t i = 0; i < handlers.Length(); i += kRegisteredEntrySize) { |
| 2277 handler_name ^= handlers.At(i + kRegisteredNameIndex); | 2285 handler_name ^= handlers.At(i + kRegisteredNameIndex); |
| 2278 ASSERT(!handler_name.IsNull()); | 2286 ASSERT(!handler_name.IsNull()); |
| 2279 if (handler_name.Equals(name)) { | 2287 if (handler_name.Equals(name)) { |
| 2280 return Instance::RawCast(handlers.At(i + kRegisteredHandlerIndex)); | 2288 return Instance::RawCast(handlers.At(i + kRegisteredHandlerIndex)); |
| 2281 } | 2289 } |
| 2282 } | 2290 } |
| 2283 return Instance::null(); | 2291 return Instance::null(); |
| 2284 } | 2292 } |
| 2293 #endif // !PRODUCT |
| 2285 | 2294 |
| 2286 | 2295 |
| 2287 void Isolate::WakePauseEventHandler(Dart_Isolate isolate) { | 2296 void Isolate::WakePauseEventHandler(Dart_Isolate isolate) { |
| 2288 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 2297 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
| 2289 MonitorLocker ml(iso->pause_loop_monitor_); | 2298 MonitorLocker ml(iso->pause_loop_monitor_); |
| 2290 ml.Notify(); | 2299 ml.Notify(); |
| 2291 } | 2300 } |
| 2292 | 2301 |
| 2293 | 2302 |
| 2294 void Isolate::PauseEventHandler() { | 2303 void Isolate::PauseEventHandler() { |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2852 void IsolateSpawnState::DecrementSpawnCount() { | 2861 void IsolateSpawnState::DecrementSpawnCount() { |
| 2853 ASSERT(spawn_count_monitor_ != NULL); | 2862 ASSERT(spawn_count_monitor_ != NULL); |
| 2854 ASSERT(spawn_count_ != NULL); | 2863 ASSERT(spawn_count_ != NULL); |
| 2855 MonitorLocker ml(spawn_count_monitor_); | 2864 MonitorLocker ml(spawn_count_monitor_); |
| 2856 ASSERT(*spawn_count_ > 0); | 2865 ASSERT(*spawn_count_ > 0); |
| 2857 *spawn_count_ = *spawn_count_ - 1; | 2866 *spawn_count_ = *spawn_count_ - 1; |
| 2858 ml.Notify(); | 2867 ml.Notify(); |
| 2859 } | 2868 } |
| 2860 | 2869 |
| 2861 } // namespace dart | 2870 } // namespace dart |
| OLD | NEW |