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