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

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

Issue 1041523002: Refactor Thread lifecycle interface, add Thread::Enter/ExitIsolate. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/native_api_impl.cc » ('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 "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 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ 529 #define REUSABLE_HANDLE_SCOPE_INIT(object) \
530 reusable_##object##_handle_scope_active_(false), 530 reusable_##object##_handle_scope_active_(false),
531 #else 531 #else
532 #define REUSABLE_HANDLE_SCOPE_INIT(object) 532 #define REUSABLE_HANDLE_SCOPE_INIT(object)
533 #endif // defined(DEBUG) 533 #endif // defined(DEBUG)
534 534
535 #define REUSABLE_HANDLE_INITIALIZERS(object) \ 535 #define REUSABLE_HANDLE_INITIALIZERS(object) \
536 object##_handle_(NULL), 536 object##_handle_(NULL),
537 537
538 Isolate::Isolate() 538 Isolate::Isolate()
539 : mutator_thread_(new Thread(this)), 539 : mutator_thread_(NULL),
540 vm_tag_(0), 540 vm_tag_(0),
541 store_buffer_(), 541 store_buffer_(),
542 message_notify_callback_(NULL), 542 message_notify_callback_(NULL),
543 name_(NULL), 543 name_(NULL),
544 debugger_name_(NULL), 544 debugger_name_(NULL),
545 start_time_(OS::GetCurrentTimeMicros()), 545 start_time_(OS::GetCurrentTimeMicros()),
546 main_port_(0), 546 main_port_(0),
547 origin_id_(0), 547 origin_id_(0),
548 pause_capability_(0), 548 pause_capability_(0),
549 terminate_capability_(0), 549 terminate_capability_(0),
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 metrics_list_head_(NULL), 597 metrics_list_head_(NULL),
598 next_(NULL), 598 next_(NULL),
599 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) 599 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
600 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) 600 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
601 reusable_handles_() { 601 reusable_handles_() {
602 set_vm_tag(VMTag::kIdleTagId); 602 set_vm_tag(VMTag::kIdleTagId);
603 set_user_tag(UserTags::kDefaultUserTag); 603 set_user_tag(UserTags::kDefaultUserTag);
604 } 604 }
605 605
606 Isolate::Isolate(Isolate* original) 606 Isolate::Isolate(Isolate* original)
607 : mutator_thread_(new Thread(this)), 607 : mutator_thread_(NULL),
608 vm_tag_(0), 608 vm_tag_(0),
609 store_buffer_(true), 609 store_buffer_(true),
610 class_table_(original->class_table()), 610 class_table_(original->class_table()),
611 message_notify_callback_(NULL), 611 message_notify_callback_(NULL),
612 name_(NULL), 612 name_(NULL),
613 debugger_name_(NULL), 613 debugger_name_(NULL),
614 start_time_(OS::GetCurrentTimeMicros()), 614 start_time_(OS::GetCurrentTimeMicros()),
615 main_port_(0), 615 main_port_(0),
616 pause_capability_(0), 616 pause_capability_(0),
617 terminate_capability_(0), 617 terminate_capability_(0),
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 delete simulator_; 678 delete simulator_;
679 #endif 679 #endif
680 delete mutex_; 680 delete mutex_;
681 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. 681 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate.
682 delete message_handler_; 682 delete message_handler_;
683 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. 683 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate.
684 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. 684 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted.
685 delete spawn_state_; 685 delete spawn_state_;
686 delete log_; 686 delete log_;
687 log_ = NULL; 687 log_ = NULL;
688 delete mutator_thread_;
689 } 688 }
690 689
691 690
692 #if defined(DEBUG) 691 #if defined(DEBUG)
693 bool Isolate::IsIsolateOf(Thread* thread) { 692 bool Isolate::IsIsolateOf(Thread* thread) {
694 return this == thread->isolate(); 693 return this == thread->isolate();
695 } 694 }
696 #endif // DEBUG 695 #endif // DEBUG
697 696
698 697
699 void Isolate::SetCurrent(Isolate* current) {
700 Isolate* old_current = Current();
701 if (old_current != NULL) {
702 old_current->set_vm_tag(VMTag::kIdleTagId);
703 old_current->set_thread_state(NULL);
704 Profiler::EndExecution(old_current);
705 }
706 if (current != NULL) {
707 Thread::SetCurrent(current->mutator_thread());
708 ASSERT(current->thread_state() == NULL);
709 InterruptableThreadState* thread_state =
710 ThreadInterrupter::GetCurrentThreadState();
711 #if defined(DEBUG)
712 CheckForDuplicateThreadState(thread_state);
713 #endif
714 ASSERT(thread_state != NULL);
715 Profiler::BeginExecution(current);
716 current->set_thread_state(thread_state);
717 current->set_vm_tag(VMTag::kVMTagId);
718 } else {
719 Thread::SetCurrent(NULL);
720 }
721 }
722
723
724 void Isolate::InitOnce() { 698 void Isolate::InitOnce() {
725 create_callback_ = NULL; 699 create_callback_ = NULL;
726 isolates_list_monitor_ = new Monitor(); 700 isolates_list_monitor_ = new Monitor();
727 ASSERT(isolates_list_monitor_ != NULL); 701 ASSERT(isolates_list_monitor_ != NULL);
728 } 702 }
729 703
730 704
731 Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) { 705 Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) {
732 Isolate* result = new Isolate(); 706 Isolate* result = new Isolate();
733 ASSERT(result != NULL); 707 ASSERT(result != NULL);
734 708
735 // Initialize metrics. 709 // Initialize metrics.
736 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ 710 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \
737 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); 711 result->metric_##variable##_.Init(result, name, NULL, Metric::unit);
738 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); 712 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT);
739 #undef ISOLATE_METRIC_INIT 713 #undef ISOLATE_METRIC_INIT
740 714
741 // TODO(5411455): For now just set the recently created isolate as 715 // TODO(5411455): For now just set the recently created isolate as
742 // the current isolate. 716 // the current isolate.
743 SetCurrent(result); 717 Thread::EnterIsolate(result);
744 718
745 // Setup the isolate specific resuable handles. 719 // Setup the isolate specific resuable handles.
746 #define REUSABLE_HANDLE_ALLOCATION(object) \ 720 #define REUSABLE_HANDLE_ALLOCATION(object) \
747 result->object##_handle_ = result->AllocateReusableHandle<object>(); 721 result->object##_handle_ = result->AllocateReusableHandle<object>();
748 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) 722 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION)
749 #undef REUSABLE_HANDLE_ALLOCATION 723 #undef REUSABLE_HANDLE_ALLOCATION
750 724
751 // Setup the isolate message handler. 725 // Setup the isolate message handler.
752 MessageHandler* handler = new IsolateMessageHandler(result); 726 MessageHandler* handler = new IsolateMessageHandler(result);
753 ASSERT(handler != NULL); 727 ASSERT(handler != NULL);
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 heap()->PrintSizes(); 1408 heap()->PrintSizes();
1435 megamorphic_cache_table()->PrintSizes(); 1409 megamorphic_cache_table()->PrintSizes();
1436 Symbols::DumpStats(); 1410 Symbols::DumpStats();
1437 OS::Print("[-] Stopping isolate:\n" 1411 OS::Print("[-] Stopping isolate:\n"
1438 "\tisolate: %s\n", name()); 1412 "\tisolate: %s\n", name());
1439 } 1413 }
1440 } 1414 }
1441 1415
1442 // TODO(5411455): For now just make sure there are no current isolates 1416 // TODO(5411455): For now just make sure there are no current isolates
1443 // as we are shutting down the isolate. 1417 // as we are shutting down the isolate.
1444 SetCurrent(NULL); 1418 Thread::ExitIsolate();
1445 Profiler::ShutdownProfilingForIsolate(this); 1419 Profiler::ShutdownProfilingForIsolate(this);
1446 } 1420 }
1447 1421
1448 1422
1449 Isolate* Isolate::ShallowCopy() { 1423 Isolate* Isolate::ShallowCopy() {
1450 return new Isolate(this); 1424 return new Isolate(this);
1451 } 1425 }
1452 1426
1453 1427
1454 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL; 1428 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL;
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 serialized_message_, serialized_message_len_); 1953 serialized_message_, serialized_message_len_);
1980 } 1954 }
1981 1955
1982 1956
1983 void IsolateSpawnState::Cleanup() { 1957 void IsolateSpawnState::Cleanup() {
1984 SwitchIsolateScope switch_scope(I); 1958 SwitchIsolateScope switch_scope(I);
1985 Dart::ShutdownIsolate(); 1959 Dart::ShutdownIsolate();
1986 } 1960 }
1987 1961
1988 } // namespace dart 1962 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/native_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698