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/json.h" | 10 #include "platform/json.h" |
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 tag_table_(GrowableObjectArray::null()), | 759 tag_table_(GrowableObjectArray::null()), |
760 collected_closures_(GrowableObjectArray::null()), | 760 collected_closures_(GrowableObjectArray::null()), |
761 deoptimized_code_array_(GrowableObjectArray::null()), | 761 deoptimized_code_array_(GrowableObjectArray::null()), |
762 background_compilation_queue_(GrowableObjectArray::null()), | 762 background_compilation_queue_(GrowableObjectArray::null()), |
763 pending_service_extension_calls_(GrowableObjectArray::null()), | 763 pending_service_extension_calls_(GrowableObjectArray::null()), |
764 registered_service_extension_handlers_(GrowableObjectArray::null()), | 764 registered_service_extension_handlers_(GrowableObjectArray::null()), |
765 metrics_list_head_(NULL), | 765 metrics_list_head_(NULL), |
766 compilation_allowed_(true), | 766 compilation_allowed_(true), |
767 cha_(NULL), | 767 cha_(NULL), |
768 next_(NULL), | 768 next_(NULL), |
769 pause_loop_monitor_(NULL), | 769 pause_loop_monitor_(NULL) { |
770 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | |
771 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | |
772 reusable_handles_() { | |
773 flags_.CopyFrom(api_flags); | 770 flags_.CopyFrom(api_flags); |
774 Thread::Current()->set_vm_tag(VMTag::kEmbedderTagId); | 771 Thread::Current()->set_vm_tag(VMTag::kEmbedderTagId); |
775 set_user_tag(UserTags::kDefaultUserTag); | 772 set_user_tag(UserTags::kDefaultUserTag); |
776 } | 773 } |
777 | 774 |
778 #undef REUSABLE_HANDLE_SCOPE_INIT | 775 #undef REUSABLE_HANDLE_SCOPE_INIT |
779 #undef REUSABLE_HANDLE_INITIALIZERS | 776 #undef REUSABLE_HANDLE_INITIALIZERS |
780 | 777 |
781 Isolate::~Isolate() { | 778 Isolate::~Isolate() { |
782 free(name_); | 779 free(name_); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 is_vm_isolate | 844 is_vm_isolate |
848 ? 0 // New gen size 0; VM isolate should only allocate in old. | 845 ? 0 // New gen size 0; VM isolate should only allocate in old. |
849 : FLAG_new_gen_semi_max_size * MBInWords, | 846 : FLAG_new_gen_semi_max_size * MBInWords, |
850 FLAG_old_gen_heap_size * MBInWords, | 847 FLAG_old_gen_heap_size * MBInWords, |
851 FLAG_external_max_size * MBInWords); | 848 FLAG_external_max_size * MBInWords); |
852 | 849 |
853 // TODO(5411455): For now just set the recently created isolate as | 850 // TODO(5411455): For now just set the recently created isolate as |
854 // the current isolate. | 851 // the current isolate. |
855 Thread::EnterIsolate(result); | 852 Thread::EnterIsolate(result); |
856 | 853 |
857 // Setup the isolate specific resuable handles. | |
858 #define REUSABLE_HANDLE_ALLOCATION(object) \ | |
859 result->object##_handle_ = result->AllocateReusableHandle<object>(); | |
860 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) | |
861 #undef REUSABLE_HANDLE_ALLOCATION | |
862 | |
863 // Setup the isolate message handler. | 854 // Setup the isolate message handler. |
864 MessageHandler* handler = new IsolateMessageHandler(result); | 855 MessageHandler* handler = new IsolateMessageHandler(result); |
865 ASSERT(handler != NULL); | 856 ASSERT(handler != NULL); |
866 result->set_message_handler(handler); | 857 result->set_message_handler(handler); |
867 | 858 |
868 // Setup the Dart API state. | 859 // Setup the Dart API state. |
869 ApiState* state = new ApiState(); | 860 ApiState* state = new ApiState(); |
870 ASSERT(state != NULL); | 861 ASSERT(state != NULL); |
871 result->set_api_state(state); | 862 result->set_api_state(state); |
872 | 863 |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 for (int i = 0; i < invoked_functions.length(); i++) { | 1538 for (int i = 0; i < invoked_functions.length(); i++) { |
1548 OS::Print("%10" Pd " x %s\n", | 1539 OS::Print("%10" Pd " x %s\n", |
1549 invoked_functions[i]->usage_counter(), | 1540 invoked_functions[i]->usage_counter(), |
1550 invoked_functions[i]->ToFullyQualifiedCString()); | 1541 invoked_functions[i]->ToFullyQualifiedCString()); |
1551 } | 1542 } |
1552 } | 1543 } |
1553 | 1544 |
1554 | 1545 |
1555 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { | 1546 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { |
1556 public: | 1547 public: |
1557 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Isolate::Current()) { | 1548 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) { |
1558 } | 1549 } |
1559 | 1550 |
1560 void VisitHandle(uword addr) { | 1551 void VisitHandle(uword addr) { |
1561 FinalizablePersistentHandle* handle = | 1552 FinalizablePersistentHandle* handle = |
1562 reinterpret_cast<FinalizablePersistentHandle*>(addr); | 1553 reinterpret_cast<FinalizablePersistentHandle*>(addr); |
1563 handle->UpdateUnreachable(I); | 1554 handle->UpdateUnreachable(thread()->isolate()); |
1564 } | 1555 } |
1565 | 1556 |
1566 private: | 1557 private: |
1567 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); | 1558 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); |
1568 }; | 1559 }; |
1569 | 1560 |
1570 | 1561 |
1571 void Isolate::LowLevelShutdown() { | 1562 void Isolate::LowLevelShutdown() { |
1572 // Ensure we have a zone and handle scope so that we can call VM functions, | 1563 // Ensure we have a zone and handle scope so that we can call VM functions, |
1573 // but we no longer allocate new heap objects. | 1564 // but we no longer allocate new heap objects. |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1738 | 1729 |
1739 // Visit objects in the object store. | 1730 // Visit objects in the object store. |
1740 object_store()->VisitObjectPointers(visitor); | 1731 object_store()->VisitObjectPointers(visitor); |
1741 | 1732 |
1742 // Visit objects in the class table. | 1733 // Visit objects in the class table. |
1743 class_table()->VisitObjectPointers(visitor); | 1734 class_table()->VisitObjectPointers(visitor); |
1744 | 1735 |
1745 // Visit objects in per isolate stubs. | 1736 // Visit objects in per isolate stubs. |
1746 StubCode::VisitObjectPointers(visitor); | 1737 StubCode::VisitObjectPointers(visitor); |
1747 | 1738 |
1748 // Visit objects in isolate specific handles area. | |
1749 reusable_handles_.VisitObjectPointers(visitor); | |
1750 | |
1751 // Visit the dart api state for all local and persistent handles. | 1739 // Visit the dart api state for all local and persistent handles. |
1752 if (api_state() != NULL) { | 1740 if (api_state() != NULL) { |
1753 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); | 1741 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); |
1754 } | 1742 } |
1755 | 1743 |
1756 // Visit the current tag which is stored in the isolate. | 1744 // Visit the current tag which is stored in the isolate. |
1757 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); | 1745 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); |
1758 | 1746 |
1759 // Visit the default tag which is stored in the isolate. | 1747 // Visit the default tag which is stored in the isolate. |
1760 visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_)); | 1748 visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_)); |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2278 creation_enabled_ = false; | 2266 creation_enabled_ = false; |
2279 } | 2267 } |
2280 | 2268 |
2281 | 2269 |
2282 void Isolate::EnableIsolateCreation() { | 2270 void Isolate::EnableIsolateCreation() { |
2283 MonitorLocker ml(isolates_list_monitor_); | 2271 MonitorLocker ml(isolates_list_monitor_); |
2284 creation_enabled_ = true; | 2272 creation_enabled_ = true; |
2285 } | 2273 } |
2286 | 2274 |
2287 | 2275 |
2288 template<class C> | |
2289 C* Isolate::AllocateReusableHandle() { | |
2290 C* handle = reinterpret_cast<C*>(reusable_handles_.AllocateScopedHandle()); | |
2291 C::initializeHandle(handle, C::null()); | |
2292 return handle; | |
2293 } | |
2294 | |
2295 | |
2296 void Isolate::KillLocked() { | 2276 void Isolate::KillLocked() { |
2297 Dart_CObject kill_msg; | 2277 Dart_CObject kill_msg; |
2298 Dart_CObject* list_values[4]; | 2278 Dart_CObject* list_values[4]; |
2299 kill_msg.type = Dart_CObject_kArray; | 2279 kill_msg.type = Dart_CObject_kArray; |
2300 kill_msg.value.as_array.length = 4; | 2280 kill_msg.value.as_array.length = 4; |
2301 kill_msg.value.as_array.values = list_values; | 2281 kill_msg.value.as_array.values = list_values; |
2302 | 2282 |
2303 Dart_CObject oob; | 2283 Dart_CObject oob; |
2304 oob.type = Dart_CObject_kInt32; | 2284 oob.type = Dart_CObject_kInt32; |
2305 oob.value.as_int32 = Message::kIsolateLibOOBMsg; | 2285 oob.value.as_int32 = Message::kIsolateLibOOBMsg; |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2575 serialized_message_, serialized_message_len_); | 2555 serialized_message_, serialized_message_len_); |
2576 } | 2556 } |
2577 | 2557 |
2578 | 2558 |
2579 void IsolateSpawnState::Cleanup() { | 2559 void IsolateSpawnState::Cleanup() { |
2580 SwitchIsolateScope switch_scope(I); | 2560 SwitchIsolateScope switch_scope(I); |
2581 Dart::ShutdownIsolate(); | 2561 Dart::ShutdownIsolate(); |
2582 } | 2562 } |
2583 | 2563 |
2584 } // namespace dart | 2564 } // namespace dart |
OLD | NEW |