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 "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "platform/json.h" | 9 #include "platform/json.h" |
10 #include "vm/code_observers.h" | 10 #include "vm/code_observers.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 49 |
50 DEFINE_FLAG(bool, trace_isolates, false, | 50 DEFINE_FLAG(bool, trace_isolates, false, |
51 "Trace isolate creation and shut down."); | 51 "Trace isolate creation and shut down."); |
52 DEFINE_FLAG(bool, pause_isolates_on_start, false, | 52 DEFINE_FLAG(bool, pause_isolates_on_start, false, |
53 "Pause isolates before starting."); | 53 "Pause isolates before starting."); |
54 DEFINE_FLAG(bool, pause_isolates_on_exit, false, | 54 DEFINE_FLAG(bool, pause_isolates_on_exit, false, |
55 "Pause isolates exiting."); | 55 "Pause isolates exiting."); |
56 DEFINE_FLAG(bool, break_at_isolate_spawn, false, | 56 DEFINE_FLAG(bool, break_at_isolate_spawn, false, |
57 "Insert a one-time breakpoint at the entrypoint for all spawned " | 57 "Insert a one-time breakpoint at the entrypoint for all spawned " |
58 "isolates"); | 58 "isolates"); |
59 DEFINE_FLAG(charp, isolate_log_filter, NULL, | |
60 "Log isolates whose name include the filter. " | |
61 "Default: service isolate log messages are suppressed."); | |
62 | 59 |
63 DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32, | 60 DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32, |
64 "Max size of new gen semi space in MB"); | 61 "Max size of new gen semi space in MB"); |
65 DEFINE_FLAG(int, old_gen_heap_size, 0, | 62 DEFINE_FLAG(int, old_gen_heap_size, 0, |
66 "Max size of old gen heap size in MB, or 0 for unlimited," | 63 "Max size of old gen heap size in MB, or 0 for unlimited," |
67 "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap"); | 64 "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap"); |
68 DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024, | 65 DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024, |
69 "Max total size of external allocations in MB, or 0 for unlimited," | 66 "Max total size of external allocations in MB, or 0 for unlimited," |
70 "e.g: --external_max_size=1024 allows up to 1024MB of externals"); | 67 "e.g: --external_max_size=1024 allows up to 1024MB of externals"); |
71 | 68 |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 message_handler_(NULL), | 689 message_handler_(NULL), |
693 spawn_state_(NULL), | 690 spawn_state_(NULL), |
694 is_runnable_(false), | 691 is_runnable_(false), |
695 gc_prologue_callback_(NULL), | 692 gc_prologue_callback_(NULL), |
696 gc_epilogue_callback_(NULL), | 693 gc_epilogue_callback_(NULL), |
697 defer_finalization_count_(0), | 694 defer_finalization_count_(0), |
698 deopt_context_(NULL), | 695 deopt_context_(NULL), |
699 edge_counter_increment_size_(-1), | 696 edge_counter_increment_size_(-1), |
700 compiler_stats_(NULL), | 697 compiler_stats_(NULL), |
701 is_service_isolate_(false), | 698 is_service_isolate_(false), |
702 log_(new class Log()), | |
703 stacktrace_(NULL), | 699 stacktrace_(NULL), |
704 stack_frame_index_(-1), | 700 stack_frame_index_(-1), |
705 last_allocationprofile_accumulator_reset_timestamp_(0), | 701 last_allocationprofile_accumulator_reset_timestamp_(0), |
706 last_allocationprofile_gc_timestamp_(0), | 702 last_allocationprofile_gc_timestamp_(0), |
707 object_id_ring_(NULL), | 703 object_id_ring_(NULL), |
708 trace_buffer_(NULL), | 704 trace_buffer_(NULL), |
709 profiler_data_(NULL), | 705 profiler_data_(NULL), |
710 tag_table_(GrowableObjectArray::null()), | 706 tag_table_(GrowableObjectArray::null()), |
711 current_tag_(UserTag::null()), | 707 current_tag_(UserTag::null()), |
712 default_tag_(UserTag::null()), | 708 default_tag_(UserTag::null()), |
(...skipping 27 matching lines...) Expand all Loading... |
740 delete debugger_; | 736 delete debugger_; |
741 #if defined(USING_SIMULATOR) | 737 #if defined(USING_SIMULATOR) |
742 delete simulator_; | 738 delete simulator_; |
743 #endif | 739 #endif |
744 delete mutex_; | 740 delete mutex_; |
745 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. | 741 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. |
746 delete message_handler_; | 742 delete message_handler_; |
747 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. | 743 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. |
748 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. | 744 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. |
749 delete spawn_state_; | 745 delete spawn_state_; |
750 delete log_; | |
751 log_ = NULL; | |
752 delete object_id_ring_; | 746 delete object_id_ring_; |
753 object_id_ring_ = NULL; | 747 object_id_ring_ = NULL; |
754 delete pause_loop_monitor_; | 748 delete pause_loop_monitor_; |
755 pause_loop_monitor_ = NULL; | 749 pause_loop_monitor_ = NULL; |
756 if (compiler_stats_ != NULL) { | 750 if (compiler_stats_ != NULL) { |
757 delete compiler_stats_; | 751 delete compiler_stats_; |
758 compiler_stats_ = NULL; | 752 compiler_stats_ = NULL; |
759 } | 753 } |
760 delete thread_registry_; | 754 delete thread_registry_; |
761 } | 755 } |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
900 name_ = strdup(name_prefix); | 894 name_ = strdup(name_prefix); |
901 return; | 895 return; |
902 } | 896 } |
903 const char* kFormat = "%s-%lld"; | 897 const char* kFormat = "%s-%lld"; |
904 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1; | 898 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1; |
905 name_ = reinterpret_cast<char*>(malloc(len)); | 899 name_ = reinterpret_cast<char*>(malloc(len)); |
906 OS::SNPrint(name_, len, kFormat, name_prefix, main_port()); | 900 OS::SNPrint(name_, len, kFormat, name_prefix, main_port()); |
907 } | 901 } |
908 | 902 |
909 | 903 |
910 Log* Isolate::Log() const { | |
911 if (FLAG_isolate_log_filter == NULL) { | |
912 if (is_service_isolate_) { | |
913 // By default, do not log for the service isolate. | |
914 return Log::NoOpLog(); | |
915 } | |
916 return log_; | |
917 } | |
918 ASSERT(name_ != NULL); | |
919 if (strstr(name_, FLAG_isolate_log_filter) == NULL) { | |
920 // Filter does not match, do not log for this isolate. | |
921 return Log::NoOpLog(); | |
922 } | |
923 return log_; | |
924 } | |
925 | |
926 | |
927 // TODO(5411455): Use flag to override default value and Validate the | 904 // TODO(5411455): Use flag to override default value and Validate the |
928 // stack size by querying OS. | 905 // stack size by querying OS. |
929 uword Isolate::GetSpecifiedStackSize() { | 906 uword Isolate::GetSpecifiedStackSize() { |
930 ASSERT(Isolate::kStackSizeBuffer < OSThread::GetMaxStackSize()); | 907 ASSERT(Isolate::kStackSizeBuffer < OSThread::GetMaxStackSize()); |
931 uword stack_size = OSThread::GetMaxStackSize() - Isolate::kStackSizeBuffer; | 908 uword stack_size = OSThread::GetMaxStackSize() - Isolate::kStackSizeBuffer; |
932 return stack_size; | 909 return stack_size; |
933 } | 910 } |
934 | 911 |
935 | 912 |
936 void Isolate::SetStackLimitFromStackBase(uword stack_base) { | 913 void Isolate::SetStackLimitFromStackBase(uword stack_base) { |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 api_state()->prologue_weak_persistent_handles().VisitHandles(&visitor); | 1535 api_state()->prologue_weak_persistent_handles().VisitHandles(&visitor); |
1559 | 1536 |
1560 if (FLAG_trace_isolates) { | 1537 if (FLAG_trace_isolates) { |
1561 heap()->PrintSizes(); | 1538 heap()->PrintSizes(); |
1562 megamorphic_cache_table()->PrintSizes(); | 1539 megamorphic_cache_table()->PrintSizes(); |
1563 Symbols::DumpStats(); | 1540 Symbols::DumpStats(); |
1564 OS::Print("[-] Stopping isolate:\n" | 1541 OS::Print("[-] Stopping isolate:\n" |
1565 "\tisolate: %s\n", name()); | 1542 "\tisolate: %s\n", name()); |
1566 } | 1543 } |
1567 if (FLAG_print_metrics) { | 1544 if (FLAG_print_metrics) { |
1568 LogBlock lb(this); | 1545 LogBlock lb; |
1569 ISL_Print("Printing metrics for %s\n", name()); | 1546 THR_Print("Printing metrics for %s\n", name()); |
1570 #define ISOLATE_METRIC_PRINT(type, variable, name, unit) \ | 1547 #define ISOLATE_METRIC_PRINT(type, variable, name, unit) \ |
1571 ISL_Print("%s\n", metric_##variable##_.ToString()); | 1548 THR_Print("%s\n", metric_##variable##_.ToString()); |
1572 ISOLATE_METRIC_LIST(ISOLATE_METRIC_PRINT); | 1549 ISOLATE_METRIC_LIST(ISOLATE_METRIC_PRINT); |
1573 #undef ISOLATE_METRIC_PRINT | 1550 #undef ISOLATE_METRIC_PRINT |
1574 ISL_Print("\n"); | 1551 THR_Print("\n"); |
1575 } | 1552 } |
1576 } | 1553 } |
1577 | 1554 |
1578 #if defined(DEBUG) | 1555 #if defined(DEBUG) |
1579 // No concurrent sweeper tasks should be running at this point. | 1556 // No concurrent sweeper tasks should be running at this point. |
1580 if (heap_ != NULL) { | 1557 if (heap_ != NULL) { |
1581 PageSpace* old_space = heap_->old_space(); | 1558 PageSpace* old_space = heap_->old_space(); |
1582 MonitorLocker ml(old_space->tasks_lock()); | 1559 MonitorLocker ml(old_space->tasks_lock()); |
1583 ASSERT(old_space->tasks() == 0); | 1560 ASSERT(old_space->tasks() == 0); |
1584 } | 1561 } |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2353 serialized_message_, serialized_message_len_); | 2330 serialized_message_, serialized_message_len_); |
2354 } | 2331 } |
2355 | 2332 |
2356 | 2333 |
2357 void IsolateSpawnState::Cleanup() { | 2334 void IsolateSpawnState::Cleanup() { |
2358 SwitchIsolateScope switch_scope(I); | 2335 SwitchIsolateScope switch_scope(I); |
2359 Dart::ShutdownIsolate(); | 2336 Dart::ShutdownIsolate(); |
2360 } | 2337 } |
2361 | 2338 |
2362 } // namespace dart | 2339 } // namespace dart |
OLD | NEW |