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

Side by Side Diff: src/isolate.cc

Issue 25697002: Revert "lazy instantiation of the default isolate" and "build fix for 17049". (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 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 | « src/isolate.h ('k') | src/v8.h » ('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 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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 FreeStoreAllocationPolicy::Delete(p); 323 FreeStoreAllocationPolicy::Delete(p);
324 return; 324 return;
325 } 325 }
326 PreallocatedStorage* storage = reinterpret_cast<PreallocatedStorage*>(p) - 1; 326 PreallocatedStorage* storage = reinterpret_cast<PreallocatedStorage*>(p) - 1;
327 ASSERT(storage->next_->previous_ == storage); 327 ASSERT(storage->next_->previous_ == storage);
328 ASSERT(storage->previous_->next_ == storage); 328 ASSERT(storage->previous_->next_ == storage);
329 storage->Unlink(); 329 storage->Unlink();
330 storage->LinkTo(&free_list_); 330 storage->LinkTo(&free_list_);
331 } 331 }
332 332
333 Isolate* Isolate::default_isolate_ = NULL;
333 Thread::LocalStorageKey Isolate::isolate_key_; 334 Thread::LocalStorageKey Isolate::isolate_key_;
334 Thread::LocalStorageKey Isolate::thread_id_key_; 335 Thread::LocalStorageKey Isolate::thread_id_key_;
335 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; 336 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_;
336 #ifdef DEBUG 337 #ifdef DEBUG
337 Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; 338 Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key;
338 #endif // DEBUG 339 #endif // DEBUG
339 Mutex Isolate::process_wide_mutex_; 340 Mutex Isolate::process_wide_mutex_;
340 // TODO(dcarney): Remove with default isolate. 341 // TODO(dcarney): Remove with default isolate.
341 enum DefaultIsolateStatus { 342 enum DefaultIsolateStatus {
342 kDefaultIsolateUninitialized, 343 kDefaultIsolateUninitialized,
343 kDefaultIsolateInitialized, 344 kDefaultIsolateInitialized,
344 kDefaultIsolateCrashIfInitialized 345 kDefaultIsolateCrashIfInitialized
345 }; 346 };
346 static DefaultIsolateStatus default_isolate_status_ 347 static DefaultIsolateStatus default_isolate_status_
347 = kDefaultIsolateUninitialized; 348 = kDefaultIsolateUninitialized;
348 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; 349 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL;
349 Atomic32 Isolate::isolate_counter_ = 0; 350 Atomic32 Isolate::isolate_counter_ = 0;
350 Atomic32 Isolate::living_isolates_ = 0;
351 351
352 Isolate::PerIsolateThreadData* 352 Isolate::PerIsolateThreadData*
353 Isolate::FindOrAllocatePerThreadDataForThisThread() { 353 Isolate::FindOrAllocatePerThreadDataForThisThread() {
354 ThreadId thread_id = ThreadId::Current(); 354 ThreadId thread_id = ThreadId::Current();
355 PerIsolateThreadData* per_thread = NULL; 355 PerIsolateThreadData* per_thread = NULL;
356 { 356 {
357 LockGuard<Mutex> lock_guard(&process_wide_mutex_); 357 LockGuard<Mutex> lock_guard(&process_wide_mutex_);
358 per_thread = thread_data_table_->Lookup(this, thread_id); 358 per_thread = thread_data_table_->Lookup(this, thread_id);
359 if (per_thread == NULL) { 359 if (per_thread == NULL) {
360 per_thread = new PerIsolateThreadData(this, thread_id); 360 per_thread = new PerIsolateThreadData(this, thread_id);
(...skipping 22 matching lines...) Expand all
383 } 383 }
384 384
385 385
386 void Isolate::SetCrashIfDefaultIsolateInitialized() { 386 void Isolate::SetCrashIfDefaultIsolateInitialized() {
387 LockGuard<Mutex> lock_guard(&process_wide_mutex_); 387 LockGuard<Mutex> lock_guard(&process_wide_mutex_);
388 CHECK(default_isolate_status_ != kDefaultIsolateInitialized); 388 CHECK(default_isolate_status_ != kDefaultIsolateInitialized);
389 default_isolate_status_ = kDefaultIsolateCrashIfInitialized; 389 default_isolate_status_ = kDefaultIsolateCrashIfInitialized;
390 } 390 }
391 391
392 392
393 Isolate* Isolate::EnsureDefaultIsolate(bool must_be_null) { 393 void Isolate::EnsureDefaultIsolate() {
394 static Isolate* default_isolate_ = NULL;
395 LockGuard<Mutex> lock_guard(&process_wide_mutex_); 394 LockGuard<Mutex> lock_guard(&process_wide_mutex_);
396 CHECK(default_isolate_status_ != kDefaultIsolateCrashIfInitialized); 395 CHECK(default_isolate_status_ != kDefaultIsolateCrashIfInitialized);
397 if (must_be_null) {
398 CHECK(default_isolate_ == NULL);
399 }
400 if (default_isolate_ == NULL) { 396 if (default_isolate_ == NULL) {
401 default_isolate_ = new Isolate(true); 397 isolate_key_ = Thread::CreateThreadLocalKey();
398 thread_id_key_ = Thread::CreateThreadLocalKey();
399 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
400 #ifdef DEBUG
401 PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey();
402 #endif // DEBUG
403 thread_data_table_ = new Isolate::ThreadDataTable();
404 default_isolate_ = new Isolate();
402 } 405 }
403 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here 406 // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
404 // because a non-null thread data may be already set. 407 // because a non-null thread data may be already set.
405 if (Thread::GetThreadLocal(isolate_key_) == NULL) { 408 if (Thread::GetThreadLocal(isolate_key_) == NULL) {
406 Thread::SetThreadLocal(isolate_key_, default_isolate_); 409 Thread::SetThreadLocal(isolate_key_, default_isolate_);
407 } 410 }
408
409 return default_isolate_;
410 } 411 }
411 412
412
413 void Isolate::InitializeThreadLocalStorage() {
414 // Double checked locking on existence of thread_data_table_.
415 if (thread_data_table_ != NULL) return;
416 LockGuard<Mutex> lock_guard(&process_wide_mutex_);
417 if (thread_data_table_ != NULL) return;
418 isolate_key_ = Thread::CreateThreadLocalKey();
419 thread_id_key_ = Thread::CreateThreadLocalKey();
420 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
421 #ifdef DEBUG
422 PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey();
423 #endif // DEBUG
424 thread_data_table_ = new Isolate::ThreadDataTable();
425 CHECK(thread_data_table_ != NULL);
426 }
427
428
429 // TODO(dcarney): Remove this with default_isolate_ and Isolate::Current.
430 struct StaticInitializer { 413 struct StaticInitializer {
431 StaticInitializer() { 414 StaticInitializer() {
432 Isolate::InitializeThreadLocalStorage(); 415 Isolate::EnsureDefaultIsolate();
433 } 416 }
434 } static_initializer; 417 } static_initializer;
435 418
436 #ifdef ENABLE_DEBUGGER_SUPPORT 419 #ifdef ENABLE_DEBUGGER_SUPPORT
437 Debugger* Isolate::GetDefaultIsolateDebugger() { 420 Debugger* Isolate::GetDefaultIsolateDebugger() {
438 return EnsureDefaultIsolate()->debugger(); 421 EnsureDefaultIsolate();
422 return default_isolate_->debugger();
439 } 423 }
440 #endif 424 #endif
441 425
442 426
443 StackGuard* Isolate::GetDefaultIsolateStackGuard() { 427 StackGuard* Isolate::GetDefaultIsolateStackGuard() {
444 return EnsureDefaultIsolate()->stack_guard(); 428 EnsureDefaultIsolate();
429 return default_isolate_->stack_guard();
445 } 430 }
446 431
447 432
448 void Isolate::EnterDefaultIsolate() { 433 void Isolate::EnterDefaultIsolate() {
449 Isolate* default_isolate = EnsureDefaultIsolate(); 434 EnsureDefaultIsolate();
450 ASSERT(default_isolate != NULL); 435 ASSERT(default_isolate_ != NULL);
451 436
452 PerIsolateThreadData* data = CurrentPerIsolateThreadData(); 437 PerIsolateThreadData* data = CurrentPerIsolateThreadData();
453 // If not yet in default isolate - enter it. 438 // If not yet in default isolate - enter it.
454 if (data == NULL || data->isolate() != default_isolate) { 439 if (data == NULL || data->isolate() != default_isolate_) {
455 default_isolate->Enter(); 440 default_isolate_->Enter();
456 } 441 }
457 } 442 }
458 443
459 444
460 v8::Isolate* Isolate::GetDefaultIsolateForLocking() { 445 v8::Isolate* Isolate::GetDefaultIsolateForLocking() {
461 return reinterpret_cast<v8::Isolate*>(EnsureDefaultIsolate()); 446 EnsureDefaultIsolate();
447 return reinterpret_cast<v8::Isolate*>(default_isolate_);
462 } 448 }
463 449
464 450
465 Address Isolate::get_address_from_id(Isolate::AddressId id) { 451 Address Isolate::get_address_from_id(Isolate::AddressId id) {
466 return isolate_addresses_[id]; 452 return isolate_addresses_[id];
467 } 453 }
468 454
469 455
470 char* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) { 456 char* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) {
471 ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage); 457 ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage);
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1741 if (FLAG_trace_isolates) { \ 1727 if (FLAG_trace_isolates) { \
1742 PrintF("Isolate %p (id %d)" #tag "\n", \ 1728 PrintF("Isolate %p (id %d)" #tag "\n", \
1743 reinterpret_cast<void*>(this), id()); \ 1729 reinterpret_cast<void*>(this), id()); \
1744 } \ 1730 } \
1745 } while (false) 1731 } while (false)
1746 #else 1732 #else
1747 #define TRACE_ISOLATE(tag) 1733 #define TRACE_ISOLATE(tag)
1748 #endif 1734 #endif
1749 1735
1750 1736
1751 Isolate::Isolate(bool is_default_isolate) 1737 Isolate::Isolate()
1752 : state_(UNINITIALIZED), 1738 : state_(UNINITIALIZED),
1753 embedder_data_(NULL), 1739 embedder_data_(NULL),
1754 entry_stack_(NULL), 1740 entry_stack_(NULL),
1755 stack_trace_nesting_level_(0), 1741 stack_trace_nesting_level_(0),
1756 incomplete_message_(NULL), 1742 incomplete_message_(NULL),
1757 preallocated_memory_thread_(NULL), 1743 preallocated_memory_thread_(NULL),
1758 preallocated_message_space_(NULL), 1744 preallocated_message_space_(NULL),
1759 bootstrapper_(NULL), 1745 bootstrapper_(NULL),
1760 runtime_profiler_(NULL), 1746 runtime_profiler_(NULL),
1761 compilation_cache_(NULL), 1747 compilation_cache_(NULL),
(...skipping 29 matching lines...) Expand all
1791 string_tracker_(NULL), 1777 string_tracker_(NULL),
1792 regexp_stack_(NULL), 1778 regexp_stack_(NULL),
1793 date_cache_(NULL), 1779 date_cache_(NULL),
1794 code_stub_interface_descriptors_(NULL), 1780 code_stub_interface_descriptors_(NULL),
1795 // TODO(bmeurer) Initialized lazily because it depends on flags; can 1781 // TODO(bmeurer) Initialized lazily because it depends on flags; can
1796 // be fixed once the default isolate cleanup is done. 1782 // be fixed once the default isolate cleanup is done.
1797 random_number_generator_(NULL), 1783 random_number_generator_(NULL),
1798 has_fatal_error_(false), 1784 has_fatal_error_(false),
1799 use_crankshaft_(true), 1785 use_crankshaft_(true),
1800 initialized_from_snapshot_(false), 1786 initialized_from_snapshot_(false),
1801 is_default_isolate_(is_default_isolate),
1802 cpu_profiler_(NULL), 1787 cpu_profiler_(NULL),
1803 heap_profiler_(NULL), 1788 heap_profiler_(NULL),
1804 function_entry_hook_(NULL), 1789 function_entry_hook_(NULL),
1805 deferred_handles_head_(NULL), 1790 deferred_handles_head_(NULL),
1806 optimizing_compiler_thread_(NULL), 1791 optimizing_compiler_thread_(NULL),
1807 sweeper_thread_(NULL), 1792 sweeper_thread_(NULL),
1808 stress_deopt_count_(0) { 1793 stress_deopt_count_(0) {
1809 InitializeThreadLocalStorage();
1810
1811 id_ = NoBarrier_AtomicIncrement(&isolate_counter_, 1); 1794 id_ = NoBarrier_AtomicIncrement(&isolate_counter_, 1);
1812 NoBarrier_AtomicIncrement(&living_isolates_, 1);
1813 TRACE_ISOLATE(constructor); 1795 TRACE_ISOLATE(constructor);
1814 1796
1815 memset(isolate_addresses_, 0, 1797 memset(isolate_addresses_, 0,
1816 sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1)); 1798 sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1));
1817 1799
1818 heap_.isolate_ = this; 1800 heap_.isolate_ = this;
1819 stack_guard_.isolate_ = this; 1801 stack_guard_.isolate_ = this;
1820 1802
1821 // ThreadManager is initialized early to support locking an isolate 1803 // ThreadManager is initialized early to support locking an isolate
1822 // before it is entered. 1804 // before it is entered.
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1985 1967
1986 Isolate::~Isolate() { 1968 Isolate::~Isolate() {
1987 TRACE_ISOLATE(destructor); 1969 TRACE_ISOLATE(destructor);
1988 1970
1989 // Has to be called while counters_ are still alive 1971 // Has to be called while counters_ are still alive
1990 runtime_zone_.DeleteKeptSegment(); 1972 runtime_zone_.DeleteKeptSegment();
1991 1973
1992 // The entry stack must be empty when we get here, 1974 // The entry stack must be empty when we get here,
1993 // except for the default isolate, where it can 1975 // except for the default isolate, where it can
1994 // still contain up to one entry stack item 1976 // still contain up to one entry stack item
1995 ASSERT(entry_stack_ == NULL || is_default_isolate_); 1977 ASSERT(entry_stack_ == NULL || this == default_isolate_);
1996 ASSERT(entry_stack_ == NULL || entry_stack_->previous_item == NULL); 1978 ASSERT(entry_stack_ == NULL || entry_stack_->previous_item == NULL);
1997 1979
1998 delete entry_stack_; 1980 delete entry_stack_;
1999 entry_stack_ = NULL; 1981 entry_stack_ = NULL;
2000 1982
2001 delete[] assembler_spare_buffer_; 1983 delete[] assembler_spare_buffer_;
2002 assembler_spare_buffer_ = NULL; 1984 assembler_spare_buffer_ = NULL;
2003 1985
2004 delete unicode_cache_; 1986 delete unicode_cache_;
2005 unicode_cache_ = NULL; 1987 unicode_cache_ = NULL;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 2052
2071 delete random_number_generator_; 2053 delete random_number_generator_;
2072 random_number_generator_ = NULL; 2054 random_number_generator_ = NULL;
2073 2055
2074 #ifdef ENABLE_DEBUGGER_SUPPORT 2056 #ifdef ENABLE_DEBUGGER_SUPPORT
2075 delete debugger_; 2057 delete debugger_;
2076 debugger_ = NULL; 2058 debugger_ = NULL;
2077 delete debug_; 2059 delete debug_;
2078 debug_ = NULL; 2060 debug_ = NULL;
2079 #endif 2061 #endif
2080
2081 NoBarrier_AtomicIncrement(&living_isolates_, -1);
2082 } 2062 }
2083 2063
2084 2064
2085 void Isolate::InitializeThreadLocal() { 2065 void Isolate::InitializeThreadLocal() {
2086 thread_local_top_.isolate_ = this; 2066 thread_local_top_.isolate_ = this;
2087 thread_local_top_.Initialize(); 2067 thread_local_top_.Initialize();
2088 } 2068 }
2089 2069
2090 2070
2091 void Isolate::PropagatePendingExceptionToExternalTryCatch() { 2071 void Isolate::PropagatePendingExceptionToExternalTryCatch() {
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
2534 2514
2535 #ifdef DEBUG 2515 #ifdef DEBUG
2536 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 2516 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \
2537 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); 2517 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_);
2538 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 2518 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
2539 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 2519 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
2540 #undef ISOLATE_FIELD_OFFSET 2520 #undef ISOLATE_FIELD_OFFSET
2541 #endif 2521 #endif
2542 2522
2543 } } // namespace v8::internal 2523 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/isolate.h ('k') | src/v8.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698