OLD | NEW |
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 Loading... |
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 | |
325 void Isolate::EnsureDefaultIsolate() { | 314 void Isolate::EnsureDefaultIsolate() { |
326 ScopedLock lock(process_wide_mutex_); | 315 ScopedLock lock(process_wide_mutex_); |
327 if (default_isolate_ == NULL) { | 316 if (default_isolate_ == NULL) { |
328 isolate_key_ = Thread::CreateThreadLocalKey(); | 317 isolate_key_ = Thread::CreateThreadLocalKey(); |
329 thread_id_key_ = Thread::CreateThreadLocalKey(); | 318 thread_id_key_ = Thread::CreateThreadLocalKey(); |
330 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); | 319 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); |
331 thread_data_table_ = new Isolate::ThreadDataTable(); | 320 thread_data_table_ = new Isolate::ThreadDataTable(); |
332 default_isolate_ = new Isolate(); | 321 default_isolate_ = new Isolate(); |
333 } | 322 } |
334 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here | 323 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
335 // becase a non-null thread data may be already set. | 324 // becase a non-null thread data may be already set. |
336 if (Thread::GetThreadLocal(isolate_key_) == NULL) { | 325 Thread::SetThreadLocal(isolate_key_, default_isolate_); |
337 Thread::SetThreadLocal(isolate_key_, default_isolate_); | |
338 } | |
339 CHECK(default_isolate_->PreInit()); | 326 CHECK(default_isolate_->PreInit()); |
340 } | 327 } |
341 | 328 |
342 | 329 |
343 #ifdef ENABLE_DEBUGGER_SUPPORT | 330 #ifdef ENABLE_DEBUGGER_SUPPORT |
344 Debugger* Isolate::GetDefaultIsolateDebugger() { | 331 Debugger* Isolate::GetDefaultIsolateDebugger() { |
345 EnsureDefaultIsolate(); | 332 EnsureDefaultIsolate(); |
346 return default_isolate_->debugger(); | 333 return default_isolate_->debugger(); |
347 } | 334 } |
348 #endif | 335 #endif |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 result_constant_list_(0) { | 451 result_constant_list_(0) { |
465 TRACE_ISOLATE(constructor); | 452 TRACE_ISOLATE(constructor); |
466 | 453 |
467 memset(isolate_addresses_, 0, | 454 memset(isolate_addresses_, 0, |
468 sizeof(isolate_addresses_[0]) * (k_isolate_address_count + 1)); | 455 sizeof(isolate_addresses_[0]) * (k_isolate_address_count + 1)); |
469 | 456 |
470 heap_.isolate_ = this; | 457 heap_.isolate_ = this; |
471 zone_.isolate_ = this; | 458 zone_.isolate_ = this; |
472 stack_guard_.isolate_ = this; | 459 stack_guard_.isolate_ = this; |
473 | 460 |
474 // ThreadManager is initialized early to support locking an isolate | |
475 // before it is entered. | |
476 thread_manager_ = new ThreadManager(); | |
477 thread_manager_->isolate_ = this; | |
478 | |
479 #if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ | 461 #if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ |
480 defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) | 462 defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) |
481 simulator_initialized_ = false; | 463 simulator_initialized_ = false; |
482 simulator_i_cache_ = NULL; | 464 simulator_i_cache_ = NULL; |
483 simulator_redirection_ = NULL; | 465 simulator_redirection_ = NULL; |
484 #endif | 466 #endif |
485 | 467 |
486 #ifdef DEBUG | 468 #ifdef DEBUG |
487 // heap_histograms_ initializes itself. | 469 // heap_histograms_ initializes itself. |
488 memset(&js_spill_information_, 0, sizeof(js_spill_information_)); | 470 memset(&js_spill_information_, 0, sizeof(js_spill_information_)); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 #endif | 636 #endif |
655 } | 637 } |
656 | 638 |
657 | 639 |
658 bool Isolate::PreInit() { | 640 bool Isolate::PreInit() { |
659 if (state_ != UNINITIALIZED) return true; | 641 if (state_ != UNINITIALIZED) return true; |
660 | 642 |
661 TRACE_ISOLATE(preinit); | 643 TRACE_ISOLATE(preinit); |
662 | 644 |
663 ASSERT(Isolate::Current() == this); | 645 ASSERT(Isolate::Current() == this); |
| 646 |
664 #ifdef ENABLE_DEBUGGER_SUPPORT | 647 #ifdef ENABLE_DEBUGGER_SUPPORT |
665 debug_ = new Debug(this); | 648 debug_ = new Debug(this); |
666 debugger_ = new Debugger(); | 649 debugger_ = new Debugger(); |
667 debugger_->isolate_ = this; | 650 debugger_->isolate_ = this; |
668 #endif | 651 #endif |
669 | 652 |
670 memory_allocator_ = new MemoryAllocator(); | 653 memory_allocator_ = new MemoryAllocator(); |
671 memory_allocator_->isolate_ = this; | 654 memory_allocator_->isolate_ = this; |
672 code_range_ = new CodeRange(); | 655 code_range_ = new CodeRange(); |
673 code_range_->isolate_ = this; | 656 code_range_->isolate_ = this; |
674 | 657 |
675 // Safe after setting Heap::isolate_, initializing StackGuard and | 658 // Safe after setting Heap::isolate_, initializing StackGuard and |
676 // ensuring that Isolate::Current() == this. | 659 // ensuring that Isolate::Current() == this. |
677 heap_.SetStackLimits(); | 660 heap_.SetStackLimits(); |
678 | 661 |
679 #ifdef DEBUG | 662 #ifdef DEBUG |
680 DisallowAllocationFailure disallow_allocation_failure; | 663 DisallowAllocationFailure disallow_allocation_failure; |
681 #endif | 664 #endif |
682 | 665 |
683 #define C(name) isolate_addresses_[Isolate::k_##name] = \ | 666 #define C(name) isolate_addresses_[Isolate::k_##name] = \ |
684 reinterpret_cast<Address>(name()); | 667 reinterpret_cast<Address>(name()); |
685 ISOLATE_ADDRESS_LIST(C) | 668 ISOLATE_ADDRESS_LIST(C) |
686 ISOLATE_ADDRESS_LIST_PROF(C) | 669 ISOLATE_ADDRESS_LIST_PROF(C) |
687 #undef C | 670 #undef C |
688 | 671 |
689 string_tracker_ = new StringTracker(); | 672 string_tracker_ = new StringTracker(); |
690 string_tracker_->isolate_ = this; | 673 string_tracker_->isolate_ = this; |
| 674 thread_manager_ = new ThreadManager(); |
| 675 thread_manager_->isolate_ = this; |
691 compilation_cache_ = new CompilationCache(this); | 676 compilation_cache_ = new CompilationCache(this); |
692 transcendental_cache_ = new TranscendentalCache(); | 677 transcendental_cache_ = new TranscendentalCache(); |
693 keyed_lookup_cache_ = new KeyedLookupCache(); | 678 keyed_lookup_cache_ = new KeyedLookupCache(); |
694 context_slot_cache_ = new ContextSlotCache(); | 679 context_slot_cache_ = new ContextSlotCache(); |
695 descriptor_lookup_cache_ = new DescriptorLookupCache(); | 680 descriptor_lookup_cache_ = new DescriptorLookupCache(); |
696 unicode_cache_ = new UnicodeCache(); | 681 unicode_cache_ = new UnicodeCache(); |
697 pc_to_code_cache_ = new PcToCodeCache(this); | 682 pc_to_code_cache_ = new PcToCodeCache(this); |
698 write_input_buffer_ = new StringInputBuffer(); | 683 write_input_buffer_ = new StringInputBuffer(); |
699 global_handles_ = new GlobalHandles(this); | 684 global_handles_ = new GlobalHandles(this); |
700 bootstrapper_ = new Bootstrapper(); | 685 bootstrapper_ = new Bootstrapper(); |
701 handle_scope_implementer_ = new HandleScopeImplementer(this); | 686 handle_scope_implementer_ = new HandleScopeImplementer(); |
702 stub_cache_ = new StubCache(this); | 687 stub_cache_ = new StubCache(this); |
703 ast_sentinels_ = new AstSentinels(); | 688 ast_sentinels_ = new AstSentinels(); |
704 regexp_stack_ = new RegExpStack(); | 689 regexp_stack_ = new RegExpStack(); |
705 regexp_stack_->isolate_ = this; | 690 regexp_stack_->isolate_ = this; |
706 | 691 |
707 #ifdef ENABLE_LOGGING_AND_PROFILING | 692 #ifdef ENABLE_LOGGING_AND_PROFILING |
708 producer_heap_profile_ = new ProducerHeapProfile(); | 693 producer_heap_profile_ = new ProducerHeapProfile(); |
709 producer_heap_profile_->isolate_ = this; | 694 producer_heap_profile_->isolate_ = this; |
710 #endif | 695 #endif |
711 | 696 |
712 state_ = PREINITIALIZED; | 697 state_ = PREINITIALIZED; |
713 return true; | 698 return true; |
714 } | 699 } |
715 | 700 |
716 | 701 |
717 void Isolate::InitializeThreadLocal() { | 702 void Isolate::InitializeThreadLocal() { |
718 thread_local_top_.isolate_ = this; | |
719 thread_local_top_.Initialize(); | 703 thread_local_top_.Initialize(); |
720 clear_pending_exception(); | 704 clear_pending_exception(); |
721 clear_pending_message(); | 705 clear_pending_message(); |
722 clear_scheduled_exception(); | 706 clear_scheduled_exception(); |
723 } | 707 } |
724 | 708 |
725 | 709 |
726 void Isolate::PropagatePendingExceptionToExternalTryCatch() { | 710 void Isolate::PropagatePendingExceptionToExternalTryCatch() { |
727 ASSERT(has_pending_exception()); | 711 ASSERT(has_pending_exception()); |
728 | 712 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 | 907 |
924 #ifdef DEBUG | 908 #ifdef DEBUG |
925 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ | 909 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
926 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); | 910 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |
927 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) | 911 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) |
928 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) | 912 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) |
929 #undef ISOLATE_FIELD_OFFSET | 913 #undef ISOLATE_FIELD_OFFSET |
930 #endif | 914 #endif |
931 | 915 |
932 } } // namespace v8::internal | 916 } } // namespace v8::internal |
OLD | NEW |