Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1507)

Side by Side Diff: runtime/vm/isolate.cc

Issue 2997243002: Move all the isolate reload code under !defined(DART_PRECOMPILED_RUNTIME) (Closed)
Patch Set: Address code review comments. Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/isolate_reload.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #include "vm/visitor.h" 50 #include "vm/visitor.h"
51 51
52 namespace dart { 52 namespace dart {
53 53
54 DECLARE_FLAG(bool, print_metrics); 54 DECLARE_FLAG(bool, print_metrics);
55 DECLARE_FLAG(bool, timing); 55 DECLARE_FLAG(bool, timing);
56 DECLARE_FLAG(bool, trace_service); 56 DECLARE_FLAG(bool, trace_service);
57 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger); 57 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
58 58
59 // Reload flags. 59 // Reload flags.
60 DECLARE_FLAG(int, reload_every);
61 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
60 DECLARE_FLAG(bool, check_reloaded); 62 DECLARE_FLAG(bool, check_reloaded);
61 DECLARE_FLAG(int, reload_every);
62 DECLARE_FLAG(bool, reload_every_back_off); 63 DECLARE_FLAG(bool, reload_every_back_off);
63 DECLARE_FLAG(bool, trace_reload); 64 DECLARE_FLAG(bool, trace_reload);
65 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
64 66
65 #if !defined(PRODUCT) 67 #if !defined(PRODUCT)
66 static void CheckedModeHandler(bool value) { 68 static void CheckedModeHandler(bool value) {
67 FLAG_enable_asserts = value; 69 FLAG_enable_asserts = value;
68 FLAG_enable_type_checks = value; 70 FLAG_enable_type_checks = value;
69 } 71 }
70 72
71 // --enable-checked-mode and --checked both enable checked mode which is 73 // --enable-checked-mode and --checked both enable checked mode which is
72 // equivalent to setting --enable-asserts and --enable-type-checks. 74 // equivalent to setting --enable-asserts and --enable-type-checks.
73 DEFINE_FLAG_HANDLER(CheckedModeHandler, 75 DEFINE_FLAG_HANDLER(CheckedModeHandler,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 NoOOBMessageScope::NoOOBMessageScope(Thread* thread) : StackResource(thread) { 139 NoOOBMessageScope::NoOOBMessageScope(Thread* thread) : StackResource(thread) {
138 thread->DeferOOBMessageInterrupts(); 140 thread->DeferOOBMessageInterrupts();
139 } 141 }
140 142
141 NoOOBMessageScope::~NoOOBMessageScope() { 143 NoOOBMessageScope::~NoOOBMessageScope() {
142 thread()->RestoreOOBMessageInterrupts(); 144 thread()->RestoreOOBMessageInterrupts();
143 } 145 }
144 146
145 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread) 147 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread)
146 : StackResource(thread), isolate_(isolate) { 148 : StackResource(thread), isolate_(isolate) {
147 #if !defined(PRODUCT) 149 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
148 ASSERT(isolate_ != NULL); 150 ASSERT(isolate_ != NULL);
149 AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_)); 151 AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_));
150 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 152 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >=
151 0); 153 0);
152 #endif // !defined(PRODUCT) 154 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
153 } 155 }
154 156
155 NoReloadScope::~NoReloadScope() { 157 NoReloadScope::~NoReloadScope() {
156 #if !defined(PRODUCT) 158 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
157 AtomicOperations::FetchAndDecrement(&(isolate_->no_reload_scope_depth_)); 159 AtomicOperations::FetchAndDecrement(&(isolate_->no_reload_scope_depth_));
158 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 160 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >=
159 0); 161 0);
160 #endif // !defined(PRODUCT) 162 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
161 } 163 }
162 164
163 void Isolate::RegisterClass(const Class& cls) { 165 void Isolate::RegisterClass(const Class& cls) {
164 #if !defined(PRODUCT) 166 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
165 if (IsReloading()) { 167 if (IsReloading()) {
166 reload_context()->RegisterClass(cls); 168 reload_context()->RegisterClass(cls);
167 return; 169 return;
168 } 170 }
169 #endif // !defined(PRODUCT) 171 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
170 class_table()->Register(cls); 172 class_table()->Register(cls);
171 } 173 }
172 174
173 void Isolate::RegisterClassAt(intptr_t index, const Class& cls) { 175 void Isolate::RegisterClassAt(intptr_t index, const Class& cls) {
174 class_table()->RegisterAt(index, cls); 176 class_table()->RegisterAt(index, cls);
175 } 177 }
176 178
177 void Isolate::ValidateClassTable() { 179 void Isolate::ValidateClassTable() {
178 class_table()->Validate(); 180 class_table()->Validate();
179 } 181 }
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 lib ^= libs.At(i); 1043 lib ^= libs.At(i);
1042 // If this library was loaded with Dart_LoadLibrary, it was marked 1044 // If this library was loaded with Dart_LoadLibrary, it was marked
1043 // as 'load in progres'. Set the status to 'loaded'. 1045 // as 'load in progres'. Set the status to 'loaded'.
1044 if (lib.LoadInProgress()) { 1046 if (lib.LoadInProgress()) {
1045 lib.SetLoaded(); 1047 lib.SetLoaded();
1046 } 1048 }
1047 } 1049 }
1048 TokenStream::CloseSharedTokenList(this); 1050 TokenStream::CloseSharedTokenList(this);
1049 } 1051 }
1050 1052
1051 #if !defined(PRODUCT) 1053 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1052 bool Isolate::CanReload() const { 1054 bool Isolate::CanReload() const {
1053 return !ServiceIsolate::IsServiceIsolateDescendant(this) && is_runnable() && 1055 return !ServiceIsolate::IsServiceIsolateDescendant(this) && is_runnable() &&
1054 !IsReloading() && 1056 !IsReloading() &&
1055 (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) && 1057 (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) &&
1056 IsolateCreationEnabled(); 1058 IsolateCreationEnabled();
1057 } 1059 }
1058 1060
1059 bool Isolate::ReloadSources(JSONStream* js, 1061 bool Isolate::ReloadSources(JSONStream* js,
1060 bool force_reload, 1062 bool force_reload,
1061 const char* root_script_url, 1063 const char* root_script_url,
(...skipping 11 matching lines...) Expand all
1073 } 1075 }
1074 1076
1075 void Isolate::DeleteReloadContext() { 1077 void Isolate::DeleteReloadContext() {
1076 // Another thread may be in the middle of GetClassForHeapWalkAt. 1078 // Another thread may be in the middle of GetClassForHeapWalkAt.
1077 Thread* thread = Thread::Current(); 1079 Thread* thread = Thread::Current();
1078 SafepointOperationScope safepoint_scope(thread); 1080 SafepointOperationScope safepoint_scope(thread);
1079 1081
1080 delete reload_context_; 1082 delete reload_context_;
1081 reload_context_ = NULL; 1083 reload_context_ = NULL;
1082 } 1084 }
1083 #endif // !defined(PRODUCT) 1085 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1084 1086
1085 void Isolate::DoneFinalizing() { 1087 void Isolate::DoneFinalizing() {
1086 #if !defined(PRODUCT) 1088 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1087 if (IsReloading()) { 1089 if (IsReloading()) {
1088 reload_context_->FinalizeLoading(); 1090 reload_context_->FinalizeLoading();
1089 } 1091 }
1090 #endif // !defined(PRODUCT) 1092 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1091 } 1093 }
1092 1094
1093 bool Isolate::MakeRunnable() { 1095 bool Isolate::MakeRunnable() {
1094 ASSERT(Isolate::Current() == NULL); 1096 ASSERT(Isolate::Current() == NULL);
1095 1097
1096 MutexLocker ml(mutex_); 1098 MutexLocker ml(mutex_);
1097 // Check if we are in a valid state to make the isolate runnable. 1099 // Check if we are in a valid state to make the isolate runnable.
1098 if (is_runnable() == true) { 1100 if (is_runnable() == true) {
1099 return false; // Already runnable. 1101 return false; // Already runnable.
1100 } 1102 }
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME) 1463 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
1462 if (!isolate->HasAttemptedReload()) { 1464 if (!isolate->HasAttemptedReload()) {
1463 // For this verification we need to stop the background compiler earlier. 1465 // For this verification we need to stop the background compiler earlier.
1464 // This would otherwise happen in Dart::ShowdownIsolate. 1466 // This would otherwise happen in Dart::ShowdownIsolate.
1465 isolate->StopBackgroundCompiler(); 1467 isolate->StopBackgroundCompiler();
1466 isolate->heap()->CollectAllGarbage(); 1468 isolate->heap()->CollectAllGarbage();
1467 HeapIterationScope iteration(thread); 1469 HeapIterationScope iteration(thread);
1468 VerifyCanonicalVisitor check_canonical(thread); 1470 VerifyCanonicalVisitor check_canonical(thread);
1469 iteration.IterateObjects(&check_canonical); 1471 iteration.IterateObjects(&check_canonical);
1470 } 1472 }
1471 #endif // DEBUG 1473 #endif // defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
1472 const Error& error = Error::Handle(thread->sticky_error()); 1474 const Error& error = Error::Handle(thread->sticky_error());
1473 if (!error.IsNull() && !error.IsUnwindError()) { 1475 if (!error.IsNull() && !error.IsUnwindError()) {
1474 OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString()); 1476 OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString());
1475 } 1477 }
1476 Dart::RunShutdownCallback(); 1478 Dart::RunShutdownCallback();
1477 } 1479 }
1478 // Shut the isolate down. 1480 // Shut the isolate down.
1479 Dart::ShutdownIsolate(isolate); 1481 Dart::ShutdownIsolate(isolate);
1480 } 1482 }
1481 1483
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 #endif // !defined(PRODUCT) 1632 #endif // !defined(PRODUCT)
1631 } 1633 }
1632 1634
1633 void Isolate::StopBackgroundCompiler() { 1635 void Isolate::StopBackgroundCompiler() {
1634 // Wait until all background compilation has finished. 1636 // Wait until all background compilation has finished.
1635 if (background_compiler_ != NULL) { 1637 if (background_compiler_ != NULL) {
1636 BackgroundCompiler::Stop(this); 1638 BackgroundCompiler::Stop(this);
1637 } 1639 }
1638 } 1640 }
1639 1641
1640 #if !defined(PRODUCT) 1642 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1641 void Isolate::MaybeIncreaseReloadEveryNStackOverflowChecks() { 1643 void Isolate::MaybeIncreaseReloadEveryNStackOverflowChecks() {
1642 if (FLAG_reload_every_back_off) { 1644 if (FLAG_reload_every_back_off) {
1643 if (reload_every_n_stack_overflow_checks_ < 5000) { 1645 if (reload_every_n_stack_overflow_checks_ < 5000) {
1644 reload_every_n_stack_overflow_checks_ += 99; 1646 reload_every_n_stack_overflow_checks_ += 99;
1645 } else { 1647 } else {
1646 reload_every_n_stack_overflow_checks_ *= 2; 1648 reload_every_n_stack_overflow_checks_ *= 2;
1647 } 1649 }
1648 // Cap the value. 1650 // Cap the value.
1649 if (reload_every_n_stack_overflow_checks_ > 1000000) { 1651 if (reload_every_n_stack_overflow_checks_ > 1000000) {
1650 reload_every_n_stack_overflow_checks_ = 1000000; 1652 reload_every_n_stack_overflow_checks_ = 1000000;
1651 } 1653 }
1652 } 1654 }
1653 } 1655 }
1654 #endif // !defined(PRODUCT) 1656 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1655 1657
1656 void Isolate::Shutdown() { 1658 void Isolate::Shutdown() {
1657 ASSERT(this == Isolate::Current()); 1659 ASSERT(this == Isolate::Current());
1658 StopBackgroundCompiler(); 1660 StopBackgroundCompiler();
1659 1661
1660 #if defined(DEBUG) 1662 #if defined(DEBUG)
1661 if (heap_ != NULL && FLAG_verify_on_transition) { 1663 if (heap_ != NULL && FLAG_verify_on_transition) {
1662 // The VM isolate keeps all objects marked. 1664 // The VM isolate keeps all objects marked.
1663 heap_->Verify(this == Dart::vm_isolate() ? kRequireMarked : kForbidMarked); 1665 heap_->Verify(this == Dart::vm_isolate() ? kRequireMarked : kForbidMarked);
1664 } 1666 }
(...skipping 25 matching lines...) Expand all
1690 if (heap_ != NULL) { 1692 if (heap_ != NULL) {
1691 // Wait for any concurrent GC tasks to finish before shutting down. 1693 // Wait for any concurrent GC tasks to finish before shutting down.
1692 // TODO(koda): Support faster sweeper shutdown (e.g., after current page). 1694 // TODO(koda): Support faster sweeper shutdown (e.g., after current page).
1693 PageSpace* old_space = heap_->old_space(); 1695 PageSpace* old_space = heap_->old_space();
1694 MonitorLocker ml(old_space->tasks_lock()); 1696 MonitorLocker ml(old_space->tasks_lock());
1695 while (old_space->tasks() > 0) { 1697 while (old_space->tasks() > 0) {
1696 ml.Wait(); 1698 ml.Wait();
1697 } 1699 }
1698 } 1700 }
1699 1701
1700 #if !defined(PRODUCT) 1702 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1701 if (FLAG_check_reloaded && is_runnable() && (this != Dart::vm_isolate()) && 1703 if (FLAG_check_reloaded && is_runnable() && (this != Dart::vm_isolate()) &&
1702 !ServiceIsolate::IsServiceIsolateDescendant(this)) { 1704 !ServiceIsolate::IsServiceIsolateDescendant(this)) {
1703 if (!HasAttemptedReload()) { 1705 if (!HasAttemptedReload()) {
1704 FATAL( 1706 FATAL(
1705 "Isolate did not reload before exiting and " 1707 "Isolate did not reload before exiting and "
1706 "--check-reloaded is enabled.\n"); 1708 "--check-reloaded is enabled.\n");
1707 } 1709 }
1708 } 1710 }
1709 #endif // !defined(PRODUCT) 1711 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1710 1712
1711 // Then, proceed with low-level teardown. 1713 // Then, proceed with low-level teardown.
1712 LowLevelShutdown(); 1714 LowLevelShutdown();
1713 1715
1714 #if defined(DEBUG) 1716 #if defined(DEBUG)
1715 // No concurrent sweeper tasks should be running at this point. 1717 // No concurrent sweeper tasks should be running at this point.
1716 if (heap_ != NULL) { 1718 if (heap_ != NULL) {
1717 PageSpace* old_space = heap_->old_space(); 1719 PageSpace* old_space = heap_->old_space();
1718 MonitorLocker ml(old_space->tasks_lock()); 1720 MonitorLocker ml(old_space->tasks_lock());
1719 ASSERT(old_space->tasks() == 0); 1721 ASSERT(old_space->tasks() == 0);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 1789
1788 // Visit the boxed_field_list_. 1790 // Visit the boxed_field_list_.
1789 // 'boxed_field_list_' access via mutator and background compilation threads 1791 // 'boxed_field_list_' access via mutator and background compilation threads
1790 // is guarded with a monitor. This means that we can visit it only 1792 // is guarded with a monitor. This means that we can visit it only
1791 // when at safepoint or the field_list_mutex_ lock has been taken. 1793 // when at safepoint or the field_list_mutex_ lock has been taken.
1792 visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_)); 1794 visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
1793 1795
1794 #if !defined(PRODUCT) 1796 #if !defined(PRODUCT)
1795 // Visit objects in the debugger. 1797 // Visit objects in the debugger.
1796 debugger()->VisitObjectPointers(visitor); 1798 debugger()->VisitObjectPointers(visitor);
1797 1799 #if !defined(DART_PRECOMPILED_RUNTIME)
1798 // Visit objects that are being used for isolate reload. 1800 // Visit objects that are being used for isolate reload.
1799 if (reload_context() != NULL) { 1801 if (reload_context() != NULL) {
1800 reload_context()->VisitObjectPointers(visitor); 1802 reload_context()->VisitObjectPointers(visitor);
1801 } 1803 }
1804 #endif // !defined(DART_PRECOMPILED_RUNTIME)
1802 if (ServiceIsolate::IsServiceIsolate(this)) { 1805 if (ServiceIsolate::IsServiceIsolate(this)) {
1803 ServiceIsolate::VisitObjectPointers(visitor); 1806 ServiceIsolate::VisitObjectPointers(visitor);
1804 } 1807 }
1805 #endif // !defined(PRODUCT) 1808 #endif // !defined(PRODUCT)
1806 1809
1807 #if !defined(DART_PRECOMPILED_RUNTIME) 1810 #if !defined(DART_PRECOMPILED_RUNTIME)
1808 // Visit objects that are being used for deoptimization. 1811 // Visit objects that are being used for deoptimization.
1809 if (deopt_context() != NULL) { 1812 if (deopt_context() != NULL) {
1810 deopt_context()->VisitObjectPointers(visitor); 1813 deopt_context()->VisitObjectPointers(visitor);
1811 } 1814 }
1812 #endif 1815 #endif // !defined(DART_PRECOMPILED_RUNTIME)
1813 1816
1814 VisitStackPointers(visitor, validate_frames); 1817 VisitStackPointers(visitor, validate_frames);
1815 } 1818 }
1816 1819
1817 void Isolate::VisitStackPointers(ObjectPointerVisitor* visitor, 1820 void Isolate::VisitStackPointers(ObjectPointerVisitor* visitor,
1818 bool validate_frames) { 1821 bool validate_frames) {
1819 // Visit objects in all threads (e.g., Dart stack, handles in zones). 1822 // Visit objects in all threads (e.g., Dart stack, handles in zones).
1820 thread_registry()->VisitObjectPointers(visitor, validate_frames); 1823 thread_registry()->VisitObjectPointers(visitor, validate_frames);
1821 } 1824 }
1822 1825
1823 void Isolate::VisitWeakPersistentHandles(HandleVisitor* visitor) { 1826 void Isolate::VisitWeakPersistentHandles(HandleVisitor* visitor) {
1824 if (api_state() != NULL) { 1827 if (api_state() != NULL) {
1825 api_state()->VisitWeakHandles(visitor); 1828 api_state()->VisitWeakHandles(visitor);
1826 } 1829 }
1827 } 1830 }
1828 1831
1829 void Isolate::PrepareForGC() { 1832 void Isolate::PrepareForGC() {
1830 thread_registry()->PrepareForGC(); 1833 thread_registry()->PrepareForGC();
1831 } 1834 }
1832 1835
1833 RawClass* Isolate::GetClassForHeapWalkAt(intptr_t cid) { 1836 RawClass* Isolate::GetClassForHeapWalkAt(intptr_t cid) {
1834 RawClass* raw_class = NULL; 1837 RawClass* raw_class = NULL;
1835 #ifndef PRODUCT 1838 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1836 if (IsReloading()) { 1839 if (IsReloading()) {
1837 raw_class = reload_context()->GetClassForHeapWalkAt(cid); 1840 raw_class = reload_context()->GetClassForHeapWalkAt(cid);
1838 } else { 1841 } else {
1839 raw_class = class_table()->At(cid); 1842 raw_class = class_table()->At(cid);
1840 } 1843 }
1841 #else 1844 #else
1842 raw_class = class_table()->At(cid); 1845 raw_class = class_table()->At(cid);
1843 #endif // !PRODUCT 1846 #endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1844 ASSERT(raw_class != NULL); 1847 ASSERT(raw_class != NULL);
1845 ASSERT(remapping_cids() || raw_class->ptr()->id_ == cid); 1848 ASSERT(remapping_cids() || raw_class->ptr()->id_ == cid);
1846 return raw_class; 1849 return raw_class;
1847 } 1850 }
1848 1851
1849 void Isolate::AddPendingDeopt(uword fp, uword pc) { 1852 void Isolate::AddPendingDeopt(uword fp, uword pc) {
1850 // GrowableArray::Add is not atomic and may be interrupt by a profiler 1853 // GrowableArray::Add is not atomic and may be interrupt by a profiler
1851 // stack walk. 1854 // stack walk.
1852 MallocGrowableArray<PendingLazyDeopt>* old_pending_deopts = pending_deopts_; 1855 MallocGrowableArray<PendingLazyDeopt>* old_pending_deopts = pending_deopts_;
1853 MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts = 1856 MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts =
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 jsobj.AddPropertyTimeMillis("startTime", start_time); 1921 jsobj.AddPropertyTimeMillis("startTime", start_time);
1919 { 1922 {
1920 JSONObject jsheap(&jsobj, "_heaps"); 1923 JSONObject jsheap(&jsobj, "_heaps");
1921 heap()->PrintToJSONObject(Heap::kNew, &jsheap); 1924 heap()->PrintToJSONObject(Heap::kNew, &jsheap);
1922 heap()->PrintToJSONObject(Heap::kOld, &jsheap); 1925 heap()->PrintToJSONObject(Heap::kOld, &jsheap);
1923 } 1926 }
1924 1927
1925 jsobj.AddProperty("runnable", is_runnable()); 1928 jsobj.AddProperty("runnable", is_runnable());
1926 jsobj.AddProperty("livePorts", message_handler()->live_ports()); 1929 jsobj.AddProperty("livePorts", message_handler()->live_ports());
1927 jsobj.AddProperty("pauseOnExit", message_handler()->should_pause_on_exit()); 1930 jsobj.AddProperty("pauseOnExit", message_handler()->should_pause_on_exit());
1931 #if !defined(DART_PRECOMPILED_RUNTIME)
1928 jsobj.AddProperty("_isReloading", IsReloading()); 1932 jsobj.AddProperty("_isReloading", IsReloading());
1933 #endif // !defined(DART_PRECOMPILED_RUNTIME)
1929 1934
1930 if (!is_runnable()) { 1935 if (!is_runnable()) {
1931 // Isolate is not yet runnable. 1936 // Isolate is not yet runnable.
1932 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL)); 1937 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL));
1933 ServiceEvent pause_event(this, ServiceEvent::kNone); 1938 ServiceEvent pause_event(this, ServiceEvent::kNone);
1934 jsobj.AddProperty("pauseEvent", &pause_event); 1939 jsobj.AddProperty("pauseEvent", &pause_event);
1935 } else if (message_handler()->is_paused_on_start() || 1940 } else if (message_handler()->is_paused_on_start() ||
1936 message_handler()->should_pause_on_start()) { 1941 message_handler()->should_pause_on_start()) {
1937 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL)); 1942 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL));
1938 ServiceEvent pause_event(this, ServiceEvent::kPauseStart); 1943 ServiceEvent pause_event(this, ServiceEvent::kPauseStart);
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 // until we are told to resume. 2305 // until we are told to resume.
2301 if (pause_loop_monitor_ == NULL) { 2306 if (pause_loop_monitor_ == NULL) {
2302 pause_loop_monitor_ = new Monitor(); 2307 pause_loop_monitor_ = new Monitor();
2303 } 2308 }
2304 Dart_EnterScope(); 2309 Dart_EnterScope();
2305 MonitorLocker ml(pause_loop_monitor_); 2310 MonitorLocker ml(pause_loop_monitor_);
2306 2311
2307 Dart_MessageNotifyCallback saved_notify_callback = message_notify_callback(); 2312 Dart_MessageNotifyCallback saved_notify_callback = message_notify_callback();
2308 set_message_notify_callback(Isolate::WakePauseEventHandler); 2313 set_message_notify_callback(Isolate::WakePauseEventHandler);
2309 2314
2315 #if !defined(DART_PRECOMPILED_RUNTIME)
2310 const bool had_isolate_reload_context = reload_context() != NULL; 2316 const bool had_isolate_reload_context = reload_context() != NULL;
2311 const int64_t start_time_micros = 2317 const int64_t start_time_micros =
2312 !had_isolate_reload_context ? 0 : reload_context()->start_time_micros(); 2318 !had_isolate_reload_context ? 0 : reload_context()->start_time_micros();
2319 #endif // !defined(DART_PRECOMPILED_RUNTIME)
2313 bool resume = false; 2320 bool resume = false;
2314 while (true) { 2321 while (true) {
2315 // Handle all available vm service messages, up to a resume 2322 // Handle all available vm service messages, up to a resume
2316 // request. 2323 // request.
2317 while (!resume && Dart_HasServiceMessages()) { 2324 while (!resume && Dart_HasServiceMessages()) {
2318 ml.Exit(); 2325 ml.Exit();
2319 resume = Dart_HandleServiceMessages(); 2326 resume = Dart_HandleServiceMessages();
2320 ml.Enter(); 2327 ml.Enter();
2321 } 2328 }
2322 if (resume) { 2329 if (resume) {
2323 break; 2330 break;
2324 } 2331 }
2325 2332
2333 #if !defined(DART_PRECOMPILED_RUNTIME)
2326 if (had_isolate_reload_context && (reload_context() == NULL)) { 2334 if (had_isolate_reload_context && (reload_context() == NULL)) {
2327 if (FLAG_trace_reload) { 2335 if (FLAG_trace_reload) {
2328 const int64_t reload_time_micros = 2336 const int64_t reload_time_micros =
2329 OS::GetCurrentMonotonicMicros() - start_time_micros; 2337 OS::GetCurrentMonotonicMicros() - start_time_micros;
2330 double reload_millis = MicrosecondsToMilliseconds(reload_time_micros); 2338 double reload_millis = MicrosecondsToMilliseconds(reload_time_micros);
2331 OS::Print("Reloading has finished! (%.2f ms)\n", reload_millis); 2339 OS::Print("Reloading has finished! (%.2f ms)\n", reload_millis);
2332 } 2340 }
2333 break; 2341 break;
2334 } 2342 }
2343 #endif // !defined(DART_PRECOMPILED_RUNTIME)
2335 2344
2336 // Wait for more service messages. 2345 // Wait for more service messages.
2337 Monitor::WaitResult res = ml.Wait(); 2346 Monitor::WaitResult res = ml.Wait();
2338 ASSERT(res == Monitor::kNotified); 2347 ASSERT(res == Monitor::kNotified);
2339 } 2348 }
2340 set_message_notify_callback(saved_notify_callback); 2349 set_message_notify_callback(saved_notify_callback);
2341 Dart_ExitScope(); 2350 Dart_ExitScope();
2342 } 2351 }
2343 #endif // !PRODUCT 2352 #endif // !PRODUCT
2344 2353
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
2832 void IsolateSpawnState::DecrementSpawnCount() { 2841 void IsolateSpawnState::DecrementSpawnCount() {
2833 ASSERT(spawn_count_monitor_ != NULL); 2842 ASSERT(spawn_count_monitor_ != NULL);
2834 ASSERT(spawn_count_ != NULL); 2843 ASSERT(spawn_count_ != NULL);
2835 MonitorLocker ml(spawn_count_monitor_); 2844 MonitorLocker ml(spawn_count_monitor_);
2836 ASSERT(*spawn_count_ > 0); 2845 ASSERT(*spawn_count_ > 0);
2837 *spawn_count_ = *spawn_count_ - 1; 2846 *spawn_count_ = *spawn_count_ - 1;
2838 ml.Notify(); 2847 ml.Notify();
2839 } 2848 }
2840 2849
2841 } // namespace dart 2850 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/isolate_reload.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698