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

Side by Side Diff: src/isolate.cc

Issue 6788023: Per-isolate v8::Locker and v8::Unlocker (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Code review feedback Created 9 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 ScopedLock lock(process_wide_mutex_); 304 ScopedLock lock(process_wide_mutex_);
305 per_thread = thread_data_table_->Lookup(this, thread_id); 305 per_thread = thread_data_table_->Lookup(this, thread_id);
306 if (per_thread == NULL) { 306 if (per_thread == NULL) {
307 per_thread = AllocatePerIsolateThreadData(thread_id); 307 per_thread = AllocatePerIsolateThreadData(thread_id);
308 } 308 }
309 } 309 }
310 return per_thread; 310 return per_thread;
311 } 311 }
312 312
313 313
314 Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() {
315 ThreadId thread_id = ThreadId::Current();
316 PerIsolateThreadData* per_thread = NULL;
317 {
318 ScopedLock lock(process_wide_mutex_);
319 per_thread = thread_data_table_->Lookup(this, thread_id);
320 }
321 return per_thread;
322 }
323
324
314 void Isolate::EnsureDefaultIsolate() { 325 void Isolate::EnsureDefaultIsolate() {
315 ScopedLock lock(process_wide_mutex_); 326 ScopedLock lock(process_wide_mutex_);
316 if (default_isolate_ == NULL) { 327 if (default_isolate_ == NULL) {
317 isolate_key_ = Thread::CreateThreadLocalKey(); 328 isolate_key_ = Thread::CreateThreadLocalKey();
318 thread_id_key_ = Thread::CreateThreadLocalKey(); 329 thread_id_key_ = Thread::CreateThreadLocalKey();
319 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); 330 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
320 thread_data_table_ = new Isolate::ThreadDataTable(); 331 thread_data_table_ = new Isolate::ThreadDataTable();
321 default_isolate_ = new Isolate(); 332 default_isolate_ = new Isolate();
322 } 333 }
323 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here 334 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
324 // becase a non-null thread data may be already set. 335 // becase a non-null thread data may be already set.
325 Thread::SetThreadLocal(isolate_key_, default_isolate_); 336 if (Thread::GetThreadLocal(isolate_key_) == NULL) {
337 Thread::SetThreadLocal(isolate_key_, default_isolate_);
338 }
326 CHECK(default_isolate_->PreInit()); 339 CHECK(default_isolate_->PreInit());
327 } 340 }
328 341
329 342
330 Debugger* Isolate::GetDefaultIsolateDebugger() { 343 Debugger* Isolate::GetDefaultIsolateDebugger() {
331 EnsureDefaultIsolate(); 344 EnsureDefaultIsolate();
332 return default_isolate_->debugger(); 345 return default_isolate_->debugger();
333 } 346 }
334 347
335 348
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 result_constant_list_(0) { 462 result_constant_list_(0) {
450 TRACE_ISOLATE(constructor); 463 TRACE_ISOLATE(constructor);
451 464
452 memset(isolate_addresses_, 0, 465 memset(isolate_addresses_, 0,
453 sizeof(isolate_addresses_[0]) * (k_isolate_address_count + 1)); 466 sizeof(isolate_addresses_[0]) * (k_isolate_address_count + 1));
454 467
455 heap_.isolate_ = this; 468 heap_.isolate_ = this;
456 zone_.isolate_ = this; 469 zone_.isolate_ = this;
457 stack_guard_.isolate_ = this; 470 stack_guard_.isolate_ = this;
458 471
472 thread_manager_ = new ThreadManager();
Vitaly Repeshko 2011/04/21 21:15:27 Add a note that thread manager is initialized earl
473 thread_manager_->isolate_ = this;
474
459 #if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ 475 #if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \
460 defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) 476 defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__)
461 simulator_initialized_ = false; 477 simulator_initialized_ = false;
462 simulator_i_cache_ = NULL; 478 simulator_i_cache_ = NULL;
463 simulator_redirection_ = NULL; 479 simulator_redirection_ = NULL;
464 #endif 480 #endif
465 481
466 #ifdef DEBUG 482 #ifdef DEBUG
467 // heap_histograms_ initializes itself. 483 // heap_histograms_ initializes itself.
468 memset(&js_spill_information_, 0, sizeof(js_spill_information_)); 484 memset(&js_spill_information_, 0, sizeof(js_spill_information_));
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 #endif 650 #endif
635 } 651 }
636 652
637 653
638 bool Isolate::PreInit() { 654 bool Isolate::PreInit() {
639 if (state_ != UNINITIALIZED) return true; 655 if (state_ != UNINITIALIZED) return true;
640 656
641 TRACE_ISOLATE(preinit); 657 TRACE_ISOLATE(preinit);
642 658
643 ASSERT(Isolate::Current() == this); 659 ASSERT(Isolate::Current() == this);
644
645 #ifdef ENABLE_DEBUGGER_SUPPORT 660 #ifdef ENABLE_DEBUGGER_SUPPORT
646 debug_ = new Debug(this); 661 debug_ = new Debug(this);
647 debugger_ = new Debugger(); 662 debugger_ = new Debugger();
648 debugger_->isolate_ = this; 663 debugger_->isolate_ = this;
649 #endif 664 #endif
650 665
651 memory_allocator_ = new MemoryAllocator(); 666 memory_allocator_ = new MemoryAllocator();
652 memory_allocator_->isolate_ = this; 667 memory_allocator_->isolate_ = this;
653 code_range_ = new CodeRange(); 668 code_range_ = new CodeRange();
654 code_range_->isolate_ = this; 669 code_range_->isolate_ = this;
655 670
656 // Safe after setting Heap::isolate_, initializing StackGuard and 671 // Safe after setting Heap::isolate_, initializing StackGuard and
657 // ensuring that Isolate::Current() == this. 672 // ensuring that Isolate::Current() == this.
658 heap_.SetStackLimits(); 673 heap_.SetStackLimits();
659 674
660 #ifdef DEBUG 675 #ifdef DEBUG
661 DisallowAllocationFailure disallow_allocation_failure; 676 DisallowAllocationFailure disallow_allocation_failure();
Vitaly Repeshko 2011/04/21 21:15:27 nit: Drop ().
662 #endif 677 #endif
663 678
664 #define C(name) isolate_addresses_[Isolate::k_##name] = \ 679 #define C(name) isolate_addresses_[Isolate::k_##name] = \
665 reinterpret_cast<Address>(name()); 680 reinterpret_cast<Address>(name());
666 ISOLATE_ADDRESS_LIST(C) 681 ISOLATE_ADDRESS_LIST(C)
667 ISOLATE_ADDRESS_LIST_PROF(C) 682 ISOLATE_ADDRESS_LIST_PROF(C)
668 #undef C 683 #undef C
669 684
670 string_tracker_ = new StringTracker(); 685 string_tracker_ = new StringTracker();
671 string_tracker_->isolate_ = this; 686 string_tracker_->isolate_ = this;
672 thread_manager_ = new ThreadManager();
673 thread_manager_->isolate_ = this;
674 compilation_cache_ = new CompilationCache(this); 687 compilation_cache_ = new CompilationCache(this);
675 transcendental_cache_ = new TranscendentalCache(); 688 transcendental_cache_ = new TranscendentalCache();
676 keyed_lookup_cache_ = new KeyedLookupCache(); 689 keyed_lookup_cache_ = new KeyedLookupCache();
677 context_slot_cache_ = new ContextSlotCache(); 690 context_slot_cache_ = new ContextSlotCache();
678 descriptor_lookup_cache_ = new DescriptorLookupCache(); 691 descriptor_lookup_cache_ = new DescriptorLookupCache();
679 unicode_cache_ = new UnicodeCache(); 692 unicode_cache_ = new UnicodeCache();
680 pc_to_code_cache_ = new PcToCodeCache(this); 693 pc_to_code_cache_ = new PcToCodeCache(this);
681 write_input_buffer_ = new StringInputBuffer(); 694 write_input_buffer_ = new StringInputBuffer();
682 global_handles_ = new GlobalHandles(this); 695 global_handles_ = new GlobalHandles(this);
683 bootstrapper_ = new Bootstrapper(); 696 bootstrapper_ = new Bootstrapper();
684 handle_scope_implementer_ = new HandleScopeImplementer(); 697 handle_scope_implementer_ = new HandleScopeImplementer(this);
685 stub_cache_ = new StubCache(this); 698 stub_cache_ = new StubCache(this);
686 ast_sentinels_ = new AstSentinels(); 699 ast_sentinels_ = new AstSentinels();
687 regexp_stack_ = new RegExpStack(); 700 regexp_stack_ = new RegExpStack();
688 regexp_stack_->isolate_ = this; 701 regexp_stack_->isolate_ = this;
689 702
690 #ifdef ENABLE_LOGGING_AND_PROFILING 703 #ifdef ENABLE_LOGGING_AND_PROFILING
691 producer_heap_profile_ = new ProducerHeapProfile(); 704 producer_heap_profile_ = new ProducerHeapProfile();
692 producer_heap_profile_->isolate_ = this; 705 producer_heap_profile_->isolate_ = this;
693 #endif 706 #endif
694 707
695 state_ = PREINITIALIZED; 708 state_ = PREINITIALIZED;
696 return true; 709 return true;
697 } 710 }
698 711
699 712
700 void Isolate::InitializeThreadLocal() { 713 void Isolate::InitializeThreadLocal() {
714 thread_local_top_.isolate_ = this;
701 thread_local_top_.Initialize(); 715 thread_local_top_.Initialize();
702 clear_pending_exception(); 716 clear_pending_exception();
703 clear_pending_message(); 717 clear_pending_message();
704 clear_scheduled_exception(); 718 clear_scheduled_exception();
705 } 719 }
706 720
707 721
708 void Isolate::PropagatePendingExceptionToExternalTryCatch() { 722 void Isolate::PropagatePendingExceptionToExternalTryCatch() {
709 ASSERT(has_pending_exception()); 723 ASSERT(has_pending_exception());
710 724
(...skipping 23 matching lines...) Expand all
734 748
735 bool Isolate::Init(Deserializer* des) { 749 bool Isolate::Init(Deserializer* des) {
736 ASSERT(state_ != INITIALIZED); 750 ASSERT(state_ != INITIALIZED);
737 751
738 TRACE_ISOLATE(init); 752 TRACE_ISOLATE(init);
739 753
740 bool create_heap_objects = des == NULL; 754 bool create_heap_objects = des == NULL;
741 755
742 #ifdef DEBUG 756 #ifdef DEBUG
743 // The initialization process does not handle memory exhaustion. 757 // The initialization process does not handle memory exhaustion.
744 DisallowAllocationFailure disallow_allocation_failure; 758 DisallowAllocationFailure disallow_allocation_failure();
Vitaly Repeshko 2011/04/21 21:15:27 nit: Drop ().
745 #endif 759 #endif
746 760
747 if (state_ == UNINITIALIZED && !PreInit()) return false; 761 if (state_ == UNINITIALIZED && !PreInit()) return false;
748 762
763
Vitaly Repeshko 2011/04/21 21:15:27 nit: Remove extra blank line.
749 // Enable logging before setting up the heap 764 // Enable logging before setting up the heap
750 logger_->Setup(); 765 logger_->Setup();
751 766
752 CpuProfiler::Setup(); 767 CpuProfiler::Setup();
753 HeapProfiler::Setup(); 768 HeapProfiler::Setup();
754 769
755 // Initialize other runtime facilities 770 // Initialize other runtime facilities
756 #if defined(USE_SIMULATOR) 771 #if defined(USE_SIMULATOR)
757 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) 772 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS)
758 Simulator::Initialize(); 773 Simulator::Initialize();
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 920
906 #ifdef DEBUG 921 #ifdef DEBUG
907 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 922 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \
908 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); 923 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_);
909 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 924 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
910 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 925 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
911 #undef ISOLATE_FIELD_OFFSET 926 #undef ISOLATE_FIELD_OFFSET
912 #endif 927 #endif
913 928
914 } } // namespace v8::internal 929 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698