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 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 defer_finalization_count_(0), | 777 defer_finalization_count_(0), |
778 deopt_context_(NULL), | 778 deopt_context_(NULL), |
779 compiler_stats_(NULL), | 779 compiler_stats_(NULL), |
780 is_service_isolate_(false), | 780 is_service_isolate_(false), |
781 stacktrace_(NULL), | 781 stacktrace_(NULL), |
782 stack_frame_index_(-1), | 782 stack_frame_index_(-1), |
783 last_allocationprofile_accumulator_reset_timestamp_(0), | 783 last_allocationprofile_accumulator_reset_timestamp_(0), |
784 last_allocationprofile_gc_timestamp_(0), | 784 last_allocationprofile_gc_timestamp_(0), |
785 object_id_ring_(NULL), | 785 object_id_ring_(NULL), |
786 trace_buffer_(NULL), | 786 trace_buffer_(NULL), |
| 787 profiler_data_(NULL), |
787 tag_table_(GrowableObjectArray::null()), | 788 tag_table_(GrowableObjectArray::null()), |
788 deoptimized_code_array_(GrowableObjectArray::null()), | 789 deoptimized_code_array_(GrowableObjectArray::null()), |
789 background_compiler_(NULL), | 790 background_compiler_(NULL), |
790 pending_service_extension_calls_(GrowableObjectArray::null()), | 791 pending_service_extension_calls_(GrowableObjectArray::null()), |
791 registered_service_extension_handlers_(GrowableObjectArray::null()), | 792 registered_service_extension_handlers_(GrowableObjectArray::null()), |
792 metrics_list_head_(NULL), | 793 metrics_list_head_(NULL), |
793 compilation_allowed_(true), | 794 compilation_allowed_(true), |
794 all_classes_finalized_(false), | 795 all_classes_finalized_(false), |
795 next_(NULL), | 796 next_(NULL), |
796 pause_loop_monitor_(NULL), | 797 pause_loop_monitor_(NULL), |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1708 MonitorLocker ml(old_space->tasks_lock()); | 1709 MonitorLocker ml(old_space->tasks_lock()); |
1709 ASSERT(old_space->tasks() == 0); | 1710 ASSERT(old_space->tasks() == 0); |
1710 } | 1711 } |
1711 #endif | 1712 #endif |
1712 | 1713 |
1713 // TODO(5411455): For now just make sure there are no current isolates | 1714 // TODO(5411455): For now just make sure there are no current isolates |
1714 // as we are shutting down the isolate. | 1715 // as we are shutting down the isolate. |
1715 Thread::ExitIsolate(); | 1716 Thread::ExitIsolate(); |
1716 // All threads should have exited by now. | 1717 // All threads should have exited by now. |
1717 thread_registry()->CheckNotScheduled(this); | 1718 thread_registry()->CheckNotScheduled(this); |
| 1719 Profiler::ShutdownProfilingForIsolate(this); |
1718 } | 1720 } |
1719 | 1721 |
1720 | 1722 |
1721 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL; | 1723 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL; |
1722 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL; | 1724 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL; |
1723 Dart_IsolateUnhandledExceptionCallback | 1725 Dart_IsolateUnhandledExceptionCallback |
1724 Isolate::unhandled_exception_callback_ = NULL; | 1726 Isolate::unhandled_exception_callback_ = NULL; |
1725 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL; | 1727 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL; |
1726 Dart_FileOpenCallback Isolate::file_open_callback_ = NULL; | 1728 Dart_FileOpenCallback Isolate::file_open_callback_ = NULL; |
1727 Dart_FileReadCallback Isolate::file_read_callback_ = NULL; | 1729 Dart_FileReadCallback Isolate::file_read_callback_ = NULL; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 debugger()->PrintBreakpointsToJSONArray(&breakpoints); | 1914 debugger()->PrintBreakpointsToJSONArray(&breakpoints); |
1913 } | 1915 } |
1914 | 1916 |
1915 { | 1917 { |
1916 JSONObject jssettings(&jsobj, "_debuggerSettings"); | 1918 JSONObject jssettings(&jsobj, "_debuggerSettings"); |
1917 debugger()->PrintSettingsToJSONObject(&jssettings); | 1919 debugger()->PrintSettingsToJSONObject(&jssettings); |
1918 } | 1920 } |
1919 } | 1921 } |
1920 | 1922 |
1921 | 1923 |
| 1924 intptr_t Isolate::ProfileInterrupt() { |
| 1925 // Other threads might be modifying these fields. Save them in locals so that |
| 1926 // we can at least trust the NULL check. |
| 1927 IsolateProfilerData* prof_data = profiler_data(); |
| 1928 if (prof_data == NULL) { |
| 1929 // Profiler not setup for isolate. |
| 1930 return 0; |
| 1931 } |
| 1932 if (prof_data->blocked()) { |
| 1933 // Profiler blocked for this isolate. |
| 1934 return 0; |
| 1935 } |
| 1936 Debugger* debug = debugger(); |
| 1937 if ((debug != NULL) && debug->IsPaused()) { |
| 1938 // Paused at breakpoint. Don't tick. |
| 1939 return 0; |
| 1940 } |
| 1941 MessageHandler* msg_handler = message_handler(); |
| 1942 if ((msg_handler != NULL) && |
| 1943 (msg_handler->paused_on_start() || |
| 1944 msg_handler->paused_on_exit())) { |
| 1945 // Paused at start / exit . Don't tick. |
| 1946 return 0; |
| 1947 } |
| 1948 // Make sure that the isolate's mutator thread does not change behind our |
| 1949 // backs. Otherwise we find the entry in the registry and end up reading |
| 1950 // the field again. Only by that time it has been reset to NULL because the |
| 1951 // thread was in process of exiting the isolate. |
| 1952 Thread* mutator = mutator_thread_; |
| 1953 if (mutator == NULL) { |
| 1954 // No active mutator. |
| 1955 ProfileIdle(); |
| 1956 return 1; |
| 1957 } |
| 1958 |
| 1959 // TODO(johnmccutchan): Sample all threads, not just the mutator thread. |
| 1960 // TODO(johnmccutchan): Keep a global list of threads and use that |
| 1961 // instead of Isolate. |
| 1962 ThreadRegistry::EntryIterator it(thread_registry()); |
| 1963 while (it.HasNext()) { |
| 1964 const ThreadRegistry::Entry& entry = it.Next(); |
| 1965 if (entry.thread == mutator) { |
| 1966 ThreadInterrupter::InterruptThread(mutator); |
| 1967 break; |
| 1968 } |
| 1969 } |
| 1970 return 1; |
| 1971 } |
| 1972 |
| 1973 |
| 1974 void Isolate::ProfileIdle() { |
| 1975 // Currently we are only sampling the mutator thread. |
| 1976 vm_tag_counters_.Increment(VMTag::kIdleTagId); |
| 1977 } |
| 1978 |
| 1979 |
1922 void Isolate::set_tag_table(const GrowableObjectArray& value) { | 1980 void Isolate::set_tag_table(const GrowableObjectArray& value) { |
1923 tag_table_ = value.raw(); | 1981 tag_table_ = value.raw(); |
1924 } | 1982 } |
1925 | 1983 |
1926 | 1984 |
1927 void Isolate::set_current_tag(const UserTag& tag) { | 1985 void Isolate::set_current_tag(const UserTag& tag) { |
1928 uword user_tag = tag.tag(); | 1986 uword user_tag = tag.tag(); |
1929 ASSERT(user_tag < kUwordMax); | 1987 ASSERT(user_tag < kUwordMax); |
1930 set_user_tag(user_tag); | 1988 set_user_tag(user_tag); |
1931 current_tag_ = tag.raw(); | 1989 current_tag_ = tag.raw(); |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2537 } | 2595 } |
2538 | 2596 |
2539 | 2597 |
2540 RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) { | 2598 RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) { |
2541 return DeserializeObject(thread, | 2599 return DeserializeObject(thread, |
2542 serialized_message_, serialized_message_len_); | 2600 serialized_message_, serialized_message_len_); |
2543 } | 2601 } |
2544 | 2602 |
2545 | 2603 |
2546 } // namespace dart | 2604 } // namespace dart |
OLD | NEW |