OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 ASSERT(storage->next_->previous_ == storage); | 329 ASSERT(storage->next_->previous_ == storage); |
330 ASSERT(storage->previous_->next_ == storage); | 330 ASSERT(storage->previous_->next_ == storage); |
331 storage->Unlink(); | 331 storage->Unlink(); |
332 storage->LinkTo(&free_list_); | 332 storage->LinkTo(&free_list_); |
333 } | 333 } |
334 | 334 |
335 Isolate* Isolate::default_isolate_ = NULL; | 335 Isolate* Isolate::default_isolate_ = NULL; |
336 Thread::LocalStorageKey Isolate::isolate_key_; | 336 Thread::LocalStorageKey Isolate::isolate_key_; |
337 Thread::LocalStorageKey Isolate::thread_id_key_; | 337 Thread::LocalStorageKey Isolate::thread_id_key_; |
338 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; | 338 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; |
339 #ifdef DEBUG | |
340 Thread::LocalStorageKey PerThreadAssertData::thread_local_key; | |
341 #endif // DEBUG | |
339 Mutex* Isolate::process_wide_mutex_ = OS::CreateMutex(); | 342 Mutex* Isolate::process_wide_mutex_ = OS::CreateMutex(); |
340 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; | 343 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; |
341 Atomic32 Isolate::isolate_counter_ = 0; | 344 Atomic32 Isolate::isolate_counter_ = 0; |
342 | 345 |
343 Isolate::PerIsolateThreadData* Isolate::AllocatePerIsolateThreadData( | 346 Isolate::PerIsolateThreadData* Isolate::AllocatePerIsolateThreadData( |
344 ThreadId thread_id) { | 347 ThreadId thread_id) { |
345 ASSERT(!thread_id.Equals(ThreadId::Invalid())); | 348 ASSERT(!thread_id.Equals(ThreadId::Invalid())); |
346 PerIsolateThreadData* per_thread = new PerIsolateThreadData(this, thread_id); | 349 PerIsolateThreadData* per_thread = new PerIsolateThreadData(this, thread_id); |
347 { | 350 { |
348 ScopedLock lock(process_wide_mutex_); | 351 ScopedLock lock(process_wide_mutex_); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 return per_thread; | 388 return per_thread; |
386 } | 389 } |
387 | 390 |
388 | 391 |
389 void Isolate::EnsureDefaultIsolate() { | 392 void Isolate::EnsureDefaultIsolate() { |
390 ScopedLock lock(process_wide_mutex_); | 393 ScopedLock lock(process_wide_mutex_); |
391 if (default_isolate_ == NULL) { | 394 if (default_isolate_ == NULL) { |
392 isolate_key_ = Thread::CreateThreadLocalKey(); | 395 isolate_key_ = Thread::CreateThreadLocalKey(); |
393 thread_id_key_ = Thread::CreateThreadLocalKey(); | 396 thread_id_key_ = Thread::CreateThreadLocalKey(); |
394 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); | 397 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); |
398 #ifdef DEBUG | |
399 PerThreadAssertData::thread_local_key = Thread::CreateThreadLocalKey(); | |
Sven Panne
2013/06/03 09:58:23
Hmmm, I think all this key creation code should li
Yang
2013/06/03 13:37:15
Will do in a follow-up CL.
| |
400 #endif // DEBUG | |
395 thread_data_table_ = new Isolate::ThreadDataTable(); | 401 thread_data_table_ = new Isolate::ThreadDataTable(); |
396 default_isolate_ = new Isolate(); | 402 default_isolate_ = new Isolate(); |
397 } | 403 } |
398 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here | 404 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
399 // because a non-null thread data may be already set. | 405 // because a non-null thread data may be already set. |
400 if (Thread::GetThreadLocal(isolate_key_) == NULL) { | 406 if (Thread::GetThreadLocal(isolate_key_) == NULL) { |
401 Thread::SetThreadLocal(isolate_key_, default_isolate_); | 407 Thread::SetThreadLocal(isolate_key_, default_isolate_); |
402 } | 408 } |
403 } | 409 } |
404 | 410 |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
882 | 888 |
883 void Isolate::PrintStack(StringStream* accumulator) { | 889 void Isolate::PrintStack(StringStream* accumulator) { |
884 if (!IsInitialized()) { | 890 if (!IsInitialized()) { |
885 accumulator->Add( | 891 accumulator->Add( |
886 "\n==== JS stack trace is not available =======================\n\n"); | 892 "\n==== JS stack trace is not available =======================\n\n"); |
887 accumulator->Add( | 893 accumulator->Add( |
888 "\n==== Isolate for the thread is not initialized =============\n\n"); | 894 "\n==== Isolate for the thread is not initialized =============\n\n"); |
889 return; | 895 return; |
890 } | 896 } |
891 // The MentionedObjectCache is not GC-proof at the moment. | 897 // The MentionedObjectCache is not GC-proof at the moment. |
892 AssertNoAllocation nogc; | 898 DisallowHeapAllocation no_gc; |
893 ASSERT(StringStream::IsMentionedObjectCacheClear()); | 899 ASSERT(StringStream::IsMentionedObjectCacheClear()); |
894 | 900 |
895 // Avoid printing anything if there are no frames. | 901 // Avoid printing anything if there are no frames. |
896 if (c_entry_fp(thread_local_top()) == 0) return; | 902 if (c_entry_fp(thread_local_top()) == 0) return; |
897 | 903 |
898 accumulator->Add( | 904 accumulator->Add( |
899 "\n==== JS stack trace =========================================\n\n"); | 905 "\n==== JS stack trace =========================================\n\n"); |
900 PrintFrames(this, accumulator, StackFrame::OVERVIEW); | 906 PrintFrames(this, accumulator, StackFrame::OVERVIEW); |
901 | 907 |
902 accumulator->Add( | 908 accumulator->Add( |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
967 | 973 |
968 return UNKNOWN; | 974 return UNKNOWN; |
969 } | 975 } |
970 | 976 |
971 | 977 |
972 bool Isolate::MayNamedAccess(JSObject* receiver, Object* key, | 978 bool Isolate::MayNamedAccess(JSObject* receiver, Object* key, |
973 v8::AccessType type) { | 979 v8::AccessType type) { |
974 ASSERT(receiver->IsAccessCheckNeeded()); | 980 ASSERT(receiver->IsAccessCheckNeeded()); |
975 | 981 |
976 // The callers of this method are not expecting a GC. | 982 // The callers of this method are not expecting a GC. |
977 AssertNoAllocation no_gc; | 983 DisallowHeapAllocation no_gc; |
978 | 984 |
979 // Skip checks for hidden properties access. Note, we do not | 985 // Skip checks for hidden properties access. Note, we do not |
980 // require existence of a context in this case. | 986 // require existence of a context in this case. |
981 if (key == heap_.hidden_string()) return true; | 987 if (key == heap_.hidden_string()) return true; |
982 | 988 |
983 // Check for compatibility between the security tokens in the | 989 // Check for compatibility between the security tokens in the |
984 // current lexical context and the accessed object. | 990 // current lexical context and the accessed object. |
985 ASSERT(context()); | 991 ASSERT(context()); |
986 | 992 |
987 MayAccessDecision decision = MayAccessPreCheck(this, receiver, type); | 993 MayAccessDecision decision = MayAccessPreCheck(this, receiver, type); |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1773 simulator_initialized_ = false; | 1779 simulator_initialized_ = false; |
1774 simulator_i_cache_ = NULL; | 1780 simulator_i_cache_ = NULL; |
1775 simulator_redirection_ = NULL; | 1781 simulator_redirection_ = NULL; |
1776 #endif | 1782 #endif |
1777 | 1783 |
1778 #ifdef DEBUG | 1784 #ifdef DEBUG |
1779 // heap_histograms_ initializes itself. | 1785 // heap_histograms_ initializes itself. |
1780 memset(&js_spill_information_, 0, sizeof(js_spill_information_)); | 1786 memset(&js_spill_information_, 0, sizeof(js_spill_information_)); |
1781 memset(code_kind_statistics_, 0, | 1787 memset(code_kind_statistics_, 0, |
1782 sizeof(code_kind_statistics_[0]) * Code::NUMBER_OF_KINDS); | 1788 sizeof(code_kind_statistics_[0]) * Code::NUMBER_OF_KINDS); |
1783 | |
1784 compiler_thread_handle_deref_state_ = HandleDereferenceGuard::ALLOW; | |
1785 execution_thread_handle_deref_state_ = HandleDereferenceGuard::ALLOW; | |
1786 #endif | 1789 #endif |
1787 | 1790 |
1788 #ifdef ENABLE_DEBUGGER_SUPPORT | 1791 #ifdef ENABLE_DEBUGGER_SUPPORT |
1789 debug_ = NULL; | 1792 debug_ = NULL; |
1790 debugger_ = NULL; | 1793 debugger_ = NULL; |
1791 #endif | 1794 #endif |
1792 | 1795 |
1793 handle_scope_data_.Initialize(); | 1796 handle_scope_data_.Initialize(); |
1794 | 1797 |
1795 #define ISOLATE_INIT_EXECUTE(type, name, initial_value) \ | 1798 #define ISOLATE_INIT_EXECUTE(type, name, initial_value) \ |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2398 } | 2401 } |
2399 if (deferred->next_ != NULL) { | 2402 if (deferred->next_ != NULL) { |
2400 deferred->next_->previous_ = deferred->previous_; | 2403 deferred->next_->previous_ = deferred->previous_; |
2401 } | 2404 } |
2402 if (deferred->previous_ != NULL) { | 2405 if (deferred->previous_ != NULL) { |
2403 deferred->previous_->next_ = deferred->next_; | 2406 deferred->previous_->next_ = deferred->next_; |
2404 } | 2407 } |
2405 } | 2408 } |
2406 | 2409 |
2407 | 2410 |
2408 #ifdef DEBUG | |
2409 HandleDereferenceGuard::State Isolate::HandleDereferenceGuardState() { | |
2410 if (execution_thread_handle_deref_state_ == HandleDereferenceGuard::ALLOW && | |
2411 compiler_thread_handle_deref_state_ == HandleDereferenceGuard::ALLOW) { | |
2412 // Short-cut to avoid polling thread id. | |
2413 return HandleDereferenceGuard::ALLOW; | |
2414 } | |
2415 if (FLAG_parallel_recompilation && | |
2416 optimizing_compiler_thread()->IsOptimizerThread()) { | |
2417 return compiler_thread_handle_deref_state_; | |
2418 } else { | |
2419 return execution_thread_handle_deref_state_; | |
2420 } | |
2421 } | |
2422 | |
2423 | |
2424 void Isolate::SetHandleDereferenceGuardState( | |
2425 HandleDereferenceGuard::State state) { | |
2426 if (FLAG_parallel_recompilation && | |
2427 optimizing_compiler_thread()->IsOptimizerThread()) { | |
2428 compiler_thread_handle_deref_state_ = state; | |
2429 } else { | |
2430 execution_thread_handle_deref_state_ = state; | |
2431 } | |
2432 } | |
2433 #endif | |
2434 | |
2435 | |
2436 HStatistics* Isolate::GetHStatistics() { | 2411 HStatistics* Isolate::GetHStatistics() { |
2437 if (hstatistics() == NULL) set_hstatistics(new HStatistics()); | 2412 if (hstatistics() == NULL) set_hstatistics(new HStatistics()); |
2438 return hstatistics(); | 2413 return hstatistics(); |
2439 } | 2414 } |
2440 | 2415 |
2441 | 2416 |
2442 HTracer* Isolate::GetHTracer() { | 2417 HTracer* Isolate::GetHTracer() { |
2443 if (htracer() == NULL) set_htracer(new HTracer(id())); | 2418 if (htracer() == NULL) set_htracer(new HTracer(id())); |
2444 return htracer(); | 2419 return htracer(); |
2445 } | 2420 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2491 | 2466 |
2492 #ifdef DEBUG | 2467 #ifdef DEBUG |
2493 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ | 2468 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
2494 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); | 2469 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |
2495 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) | 2470 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) |
2496 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) | 2471 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) |
2497 #undef ISOLATE_FIELD_OFFSET | 2472 #undef ISOLATE_FIELD_OFFSET |
2498 #endif | 2473 #endif |
2499 | 2474 |
2500 } } // namespace v8::internal | 2475 } } // namespace v8::internal |
OLD | NEW |