| 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 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 tag_table_(GrowableObjectArray::null()), | 787 tag_table_(GrowableObjectArray::null()), |
| 788 collected_closures_(GrowableObjectArray::null()), | 788 collected_closures_(GrowableObjectArray::null()), |
| 789 deoptimized_code_array_(GrowableObjectArray::null()), | 789 deoptimized_code_array_(GrowableObjectArray::null()), |
| 790 background_compilation_queue_(GrowableObjectArray::null()), | 790 background_compilation_queue_(GrowableObjectArray::null()), |
| 791 pending_service_extension_calls_(GrowableObjectArray::null()), | 791 pending_service_extension_calls_(GrowableObjectArray::null()), |
| 792 registered_service_extension_handlers_(GrowableObjectArray::null()), | 792 registered_service_extension_handlers_(GrowableObjectArray::null()), |
| 793 metrics_list_head_(NULL), | 793 metrics_list_head_(NULL), |
| 794 compilation_allowed_(true), | 794 compilation_allowed_(true), |
| 795 cha_(NULL), | 795 cha_(NULL), |
| 796 next_(NULL), | 796 next_(NULL), |
| 797 pause_loop_monitor_(NULL), | 797 pause_loop_monitor_(NULL) { |
| 798 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | |
| 799 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | |
| 800 reusable_handles_() { | |
| 801 flags_.CopyFrom(api_flags); | 798 flags_.CopyFrom(api_flags); |
| 802 Thread::Current()->set_vm_tag(VMTag::kEmbedderTagId); | 799 Thread::Current()->set_vm_tag(VMTag::kEmbedderTagId); |
| 803 set_user_tag(UserTags::kDefaultUserTag); | 800 set_user_tag(UserTags::kDefaultUserTag); |
| 804 } | 801 } |
| 805 | 802 |
| 806 #undef REUSABLE_HANDLE_SCOPE_INIT | 803 #undef REUSABLE_HANDLE_SCOPE_INIT |
| 807 #undef REUSABLE_HANDLE_INITIALIZERS | 804 #undef REUSABLE_HANDLE_INITIALIZERS |
| 808 | 805 |
| 809 Isolate::~Isolate() { | 806 Isolate::~Isolate() { |
| 810 free(name_); | 807 free(name_); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 is_vm_isolate | 872 is_vm_isolate |
| 876 ? 0 // New gen size 0; VM isolate should only allocate in old. | 873 ? 0 // New gen size 0; VM isolate should only allocate in old. |
| 877 : FLAG_new_gen_semi_max_size * MBInWords, | 874 : FLAG_new_gen_semi_max_size * MBInWords, |
| 878 FLAG_old_gen_heap_size * MBInWords, | 875 FLAG_old_gen_heap_size * MBInWords, |
| 879 FLAG_external_max_size * MBInWords); | 876 FLAG_external_max_size * MBInWords); |
| 880 | 877 |
| 881 // TODO(5411455): For now just set the recently created isolate as | 878 // TODO(5411455): For now just set the recently created isolate as |
| 882 // the current isolate. | 879 // the current isolate. |
| 883 Thread::EnterIsolate(result); | 880 Thread::EnterIsolate(result); |
| 884 | 881 |
| 885 // Setup the isolate specific resuable handles. | |
| 886 #define REUSABLE_HANDLE_ALLOCATION(object) \ | |
| 887 result->object##_handle_ = result->AllocateReusableHandle<object>(); | |
| 888 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) | |
| 889 #undef REUSABLE_HANDLE_ALLOCATION | |
| 890 | |
| 891 // Setup the isolate message handler. | 882 // Setup the isolate message handler. |
| 892 MessageHandler* handler = new IsolateMessageHandler(result); | 883 MessageHandler* handler = new IsolateMessageHandler(result); |
| 893 ASSERT(handler != NULL); | 884 ASSERT(handler != NULL); |
| 894 result->set_message_handler(handler); | 885 result->set_message_handler(handler); |
| 895 | 886 |
| 896 // Setup the Dart API state. | 887 // Setup the Dart API state. |
| 897 ApiState* state = new ApiState(); | 888 ApiState* state = new ApiState(); |
| 898 ASSERT(state != NULL); | 889 ASSERT(state != NULL); |
| 899 result->set_api_state(state); | 890 result->set_api_state(state); |
| 900 | 891 |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 for (int i = 0; i < invoked_functions.length(); i++) { | 1564 for (int i = 0; i < invoked_functions.length(); i++) { |
| 1574 OS::Print("%10" Pd " x %s\n", | 1565 OS::Print("%10" Pd " x %s\n", |
| 1575 invoked_functions[i]->usage_counter(), | 1566 invoked_functions[i]->usage_counter(), |
| 1576 invoked_functions[i]->ToFullyQualifiedCString()); | 1567 invoked_functions[i]->ToFullyQualifiedCString()); |
| 1577 } | 1568 } |
| 1578 } | 1569 } |
| 1579 | 1570 |
| 1580 | 1571 |
| 1581 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { | 1572 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { |
| 1582 public: | 1573 public: |
| 1583 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Isolate::Current()) { | 1574 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) { |
| 1584 } | 1575 } |
| 1585 | 1576 |
| 1586 void VisitHandle(uword addr) { | 1577 void VisitHandle(uword addr) { |
| 1587 FinalizablePersistentHandle* handle = | 1578 FinalizablePersistentHandle* handle = |
| 1588 reinterpret_cast<FinalizablePersistentHandle*>(addr); | 1579 reinterpret_cast<FinalizablePersistentHandle*>(addr); |
| 1589 handle->UpdateUnreachable(I); | 1580 handle->UpdateUnreachable(thread()->isolate()); |
| 1590 } | 1581 } |
| 1591 | 1582 |
| 1592 private: | 1583 private: |
| 1593 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); | 1584 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); |
| 1594 }; | 1585 }; |
| 1595 | 1586 |
| 1596 | 1587 |
| 1597 void Isolate::LowLevelShutdown() { | 1588 void Isolate::LowLevelShutdown() { |
| 1598 // Ensure we have a zone and handle scope so that we can call VM functions, | 1589 // Ensure we have a zone and handle scope so that we can call VM functions, |
| 1599 // but we no longer allocate new heap objects. | 1590 // but we no longer allocate new heap objects. |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1764 | 1755 |
| 1765 // Visit objects in the object store. | 1756 // Visit objects in the object store. |
| 1766 object_store()->VisitObjectPointers(visitor); | 1757 object_store()->VisitObjectPointers(visitor); |
| 1767 | 1758 |
| 1768 // Visit objects in the class table. | 1759 // Visit objects in the class table. |
| 1769 class_table()->VisitObjectPointers(visitor); | 1760 class_table()->VisitObjectPointers(visitor); |
| 1770 | 1761 |
| 1771 // Visit objects in per isolate stubs. | 1762 // Visit objects in per isolate stubs. |
| 1772 StubCode::VisitObjectPointers(visitor); | 1763 StubCode::VisitObjectPointers(visitor); |
| 1773 | 1764 |
| 1774 // Visit objects in isolate specific handles area. | |
| 1775 reusable_handles_.VisitObjectPointers(visitor); | |
| 1776 | |
| 1777 // Visit the dart api state for all local and persistent handles. | 1765 // Visit the dart api state for all local and persistent handles. |
| 1778 if (api_state() != NULL) { | 1766 if (api_state() != NULL) { |
| 1779 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); | 1767 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); |
| 1780 } | 1768 } |
| 1781 | 1769 |
| 1782 // Visit the current tag which is stored in the isolate. | 1770 // Visit the current tag which is stored in the isolate. |
| 1783 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); | 1771 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); |
| 1784 | 1772 |
| 1785 // Visit the default tag which is stored in the isolate. | 1773 // Visit the default tag which is stored in the isolate. |
| 1786 visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_)); | 1774 visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_)); |
| (...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2306 creation_enabled_ = false; | 2294 creation_enabled_ = false; |
| 2307 } | 2295 } |
| 2308 | 2296 |
| 2309 | 2297 |
| 2310 void Isolate::EnableIsolateCreation() { | 2298 void Isolate::EnableIsolateCreation() { |
| 2311 MonitorLocker ml(isolates_list_monitor_); | 2299 MonitorLocker ml(isolates_list_monitor_); |
| 2312 creation_enabled_ = true; | 2300 creation_enabled_ = true; |
| 2313 } | 2301 } |
| 2314 | 2302 |
| 2315 | 2303 |
| 2316 template<class C> | |
| 2317 C* Isolate::AllocateReusableHandle() { | |
| 2318 C* handle = reinterpret_cast<C*>(reusable_handles_.AllocateScopedHandle()); | |
| 2319 C::initializeHandle(handle, C::null()); | |
| 2320 return handle; | |
| 2321 } | |
| 2322 | |
| 2323 | |
| 2324 void Isolate::KillLocked(LibMsgId msg_id) { | 2304 void Isolate::KillLocked(LibMsgId msg_id) { |
| 2325 Dart_CObject kill_msg; | 2305 Dart_CObject kill_msg; |
| 2326 Dart_CObject* list_values[4]; | 2306 Dart_CObject* list_values[4]; |
| 2327 kill_msg.type = Dart_CObject_kArray; | 2307 kill_msg.type = Dart_CObject_kArray; |
| 2328 kill_msg.value.as_array.length = 4; | 2308 kill_msg.value.as_array.length = 4; |
| 2329 kill_msg.value.as_array.values = list_values; | 2309 kill_msg.value.as_array.values = list_values; |
| 2330 | 2310 |
| 2331 Dart_CObject oob; | 2311 Dart_CObject oob; |
| 2332 oob.type = Dart_CObject_kInt32; | 2312 oob.type = Dart_CObject_kInt32; |
| 2333 oob.value.as_int32 = Message::kIsolateLibOOBMsg; | 2313 oob.value.as_int32 = Message::kIsolateLibOOBMsg; |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2605 serialized_message_, serialized_message_len_); | 2585 serialized_message_, serialized_message_len_); |
| 2606 } | 2586 } |
| 2607 | 2587 |
| 2608 | 2588 |
| 2609 void IsolateSpawnState::Cleanup() { | 2589 void IsolateSpawnState::Cleanup() { |
| 2610 SwitchIsolateScope switch_scope(I); | 2590 SwitchIsolateScope switch_scope(I); |
| 2611 Dart::ShutdownIsolate(); | 2591 Dart::ShutdownIsolate(); |
| 2612 } | 2592 } |
| 2613 | 2593 |
| 2614 } // namespace dart | 2594 } // namespace dart |
| OLD | NEW |