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

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

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

Powered by Google App Engine
This is Rietveld 408576698