| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_ISOLATE_H_ | 5 #ifndef V8_ISOLATE_H_ |
| 6 #define V8_ISOLATE_H_ | 6 #define V8_ISOLATE_H_ |
| 7 | 7 |
| 8 #include "include/v8-debug.h" | 8 #include "include/v8-debug.h" |
| 9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
| 10 #include "src/assert-scope.h" | 10 #include "src/assert-scope.h" |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 }; | 459 }; |
| 460 | 460 |
| 461 | 461 |
| 462 enum AddressId { | 462 enum AddressId { |
| 463 #define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address, | 463 #define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address, |
| 464 FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM) | 464 FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM) |
| 465 #undef DECLARE_ENUM | 465 #undef DECLARE_ENUM |
| 466 kIsolateAddressCount | 466 kIsolateAddressCount |
| 467 }; | 467 }; |
| 468 | 468 |
| 469 static void InitializeOncePerProcess(); |
| 470 |
| 469 // Returns the PerIsolateThreadData for the current thread (or NULL if one is | 471 // Returns the PerIsolateThreadData for the current thread (or NULL if one is |
| 470 // not currently set). | 472 // not currently set). |
| 471 static PerIsolateThreadData* CurrentPerIsolateThreadData() { | 473 static PerIsolateThreadData* CurrentPerIsolateThreadData() { |
| 472 EnsureInitialized(); | |
| 473 return reinterpret_cast<PerIsolateThreadData*>( | 474 return reinterpret_cast<PerIsolateThreadData*>( |
| 474 base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); | 475 base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); |
| 475 } | 476 } |
| 476 | 477 |
| 477 // Returns the isolate inside which the current thread is running. | 478 // Returns the isolate inside which the current thread is running. |
| 478 INLINE(static Isolate* Current()) { | 479 INLINE(static Isolate* Current()) { |
| 479 EnsureInitialized(); | |
| 480 Isolate* isolate = reinterpret_cast<Isolate*>( | 480 Isolate* isolate = reinterpret_cast<Isolate*>( |
| 481 base::Thread::GetExistingThreadLocal(isolate_key_)); | 481 base::Thread::GetExistingThreadLocal(isolate_key_)); |
| 482 DCHECK(isolate != NULL); | 482 DCHECK(isolate != NULL); |
| 483 return isolate; | 483 return isolate; |
| 484 } | 484 } |
| 485 | 485 |
| 486 INLINE(static Isolate* UncheckedCurrent()) { | 486 INLINE(static Isolate* UncheckedCurrent()) { |
| 487 EnsureInitialized(); | |
| 488 return reinterpret_cast<Isolate*>( | 487 return reinterpret_cast<Isolate*>( |
| 489 base::Thread::GetThreadLocal(isolate_key_)); | 488 base::Thread::GetThreadLocal(isolate_key_)); |
| 490 } | 489 } |
| 491 | 490 |
| 492 // Like UncheckedCurrent, but skips the check that |isolate_key_| was | 491 // Like UncheckedCurrent, but skips the check that |isolate_key_| was |
| 493 // initialized. Callers have to ensure that themselves. | 492 // initialized. Callers have to ensure that themselves. |
| 494 INLINE(static Isolate* UnsafeCurrent()) { | 493 INLINE(static Isolate* UnsafeCurrent()) { |
| 495 return reinterpret_cast<Isolate*>( | 494 return reinterpret_cast<Isolate*>( |
| 496 base::Thread::GetThreadLocal(isolate_key_)); | 495 base::Thread::GetThreadLocal(isolate_key_)); |
| 497 } | 496 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 522 PerIsolateThreadData* FindPerThreadDataForThisThread(); | 521 PerIsolateThreadData* FindPerThreadDataForThisThread(); |
| 523 | 522 |
| 524 // Find the PerThread for given (isolate, thread) combination | 523 // Find the PerThread for given (isolate, thread) combination |
| 525 // If one does not yet exist, return null. | 524 // If one does not yet exist, return null. |
| 526 PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id); | 525 PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id); |
| 527 | 526 |
| 528 // Returns the key used to store the pointer to the current isolate. | 527 // Returns the key used to store the pointer to the current isolate. |
| 529 // Used internally for V8 threads that do not execute JavaScript but still | 528 // Used internally for V8 threads that do not execute JavaScript but still |
| 530 // are part of the domain of an isolate (like the context switcher). | 529 // are part of the domain of an isolate (like the context switcher). |
| 531 static base::Thread::LocalStorageKey isolate_key() { | 530 static base::Thread::LocalStorageKey isolate_key() { |
| 532 EnsureInitialized(); | |
| 533 return isolate_key_; | 531 return isolate_key_; |
| 534 } | 532 } |
| 535 | 533 |
| 536 // Returns the key used to store process-wide thread IDs. | 534 // Returns the key used to store process-wide thread IDs. |
| 537 static base::Thread::LocalStorageKey thread_id_key() { | 535 static base::Thread::LocalStorageKey thread_id_key() { |
| 538 EnsureInitialized(); | |
| 539 return thread_id_key_; | 536 return thread_id_key_; |
| 540 } | 537 } |
| 541 | 538 |
| 542 static base::Thread::LocalStorageKey per_isolate_thread_data_key(); | 539 static base::Thread::LocalStorageKey per_isolate_thread_data_key(); |
| 543 | 540 |
| 544 // Mutex for serializing access to break control structures. | 541 // Mutex for serializing access to break control structures. |
| 545 base::RecursiveMutex* break_access() { return &break_access_; } | 542 base::RecursiveMutex* break_access() { return &break_access_; } |
| 546 | 543 |
| 547 Address get_address_from_id(AddressId id); | 544 Address get_address_from_id(AddressId id); |
| 548 | 545 |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1103 void AddCallCompletedCallback(CallCompletedCallback callback); | 1100 void AddCallCompletedCallback(CallCompletedCallback callback); |
| 1104 void RemoveCallCompletedCallback(CallCompletedCallback callback); | 1101 void RemoveCallCompletedCallback(CallCompletedCallback callback); |
| 1105 void FireCallCompletedCallback(); | 1102 void FireCallCompletedCallback(); |
| 1106 | 1103 |
| 1107 void EnqueueMicrotask(Handle<Object> microtask); | 1104 void EnqueueMicrotask(Handle<Object> microtask); |
| 1108 void RunMicrotasks(); | 1105 void RunMicrotasks(); |
| 1109 | 1106 |
| 1110 void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback); | 1107 void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback); |
| 1111 void CountUsage(v8::Isolate::UseCounterFeature feature); | 1108 void CountUsage(v8::Isolate::UseCounterFeature feature); |
| 1112 | 1109 |
| 1110 static Isolate* NewForTesting() { return new Isolate(); } |
| 1111 |
| 1113 private: | 1112 private: |
| 1114 static void EnsureInitialized(); | |
| 1115 | |
| 1116 Isolate(); | 1113 Isolate(); |
| 1117 | 1114 |
| 1118 friend struct GlobalState; | 1115 friend struct GlobalState; |
| 1119 friend struct InitializeGlobalState; | 1116 friend struct InitializeGlobalState; |
| 1120 | 1117 |
| 1121 enum State { | 1118 enum State { |
| 1122 UNINITIALIZED, // Some components may not have been allocated. | 1119 UNINITIALIZED, // Some components may not have been allocated. |
| 1123 INITIALIZED // All components are fully initialized. | 1120 INITIALIZED // All components are fully initialized. |
| 1124 }; | 1121 }; |
| 1125 | 1122 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 | 1161 |
| 1165 int entry_count; | 1162 int entry_count; |
| 1166 PerIsolateThreadData* previous_thread_data; | 1163 PerIsolateThreadData* previous_thread_data; |
| 1167 Isolate* previous_isolate; | 1164 Isolate* previous_isolate; |
| 1168 EntryStackItem* previous_item; | 1165 EntryStackItem* previous_item; |
| 1169 | 1166 |
| 1170 private: | 1167 private: |
| 1171 DISALLOW_COPY_AND_ASSIGN(EntryStackItem); | 1168 DISALLOW_COPY_AND_ASSIGN(EntryStackItem); |
| 1172 }; | 1169 }; |
| 1173 | 1170 |
| 1174 // This mutex protects highest_thread_id_ and thread_data_table_. | 1171 static base::LazyMutex thread_data_table_mutex_; |
| 1175 static base::LazyMutex process_wide_mutex_; | |
| 1176 | 1172 |
| 1177 static base::Thread::LocalStorageKey per_isolate_thread_data_key_; | 1173 static base::Thread::LocalStorageKey per_isolate_thread_data_key_; |
| 1178 static base::Thread::LocalStorageKey isolate_key_; | 1174 static base::Thread::LocalStorageKey isolate_key_; |
| 1179 static base::Thread::LocalStorageKey thread_id_key_; | 1175 static base::Thread::LocalStorageKey thread_id_key_; |
| 1180 static ThreadDataTable* thread_data_table_; | 1176 static ThreadDataTable* thread_data_table_; |
| 1181 | 1177 |
| 1182 // A global counter for all generated Isolates, might overflow. | 1178 // A global counter for all generated Isolates, might overflow. |
| 1183 static base::Atomic32 isolate_counter_; | 1179 static base::Atomic32 isolate_counter_; |
| 1184 | 1180 |
| 1185 void Deinit(); | 1181 void Deinit(); |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 } | 1549 } |
| 1554 | 1550 |
| 1555 EmbeddedVector<char, 128> filename_; | 1551 EmbeddedVector<char, 128> filename_; |
| 1556 FILE* file_; | 1552 FILE* file_; |
| 1557 int scope_depth_; | 1553 int scope_depth_; |
| 1558 }; | 1554 }; |
| 1559 | 1555 |
| 1560 } } // namespace v8::internal | 1556 } } // namespace v8::internal |
| 1561 | 1557 |
| 1562 #endif // V8_ISOLATE_H_ | 1558 #endif // V8_ISOLATE_H_ |
| OLD | NEW |