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 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 storage->LinkTo(&free_list_); | 336 storage->LinkTo(&free_list_); |
337 } | 337 } |
338 | 338 |
339 Isolate* Isolate::default_isolate_ = NULL; | 339 Isolate* Isolate::default_isolate_ = NULL; |
340 Thread::LocalStorageKey Isolate::isolate_key_; | 340 Thread::LocalStorageKey Isolate::isolate_key_; |
341 Thread::LocalStorageKey Isolate::thread_id_key_; | 341 Thread::LocalStorageKey Isolate::thread_id_key_; |
342 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; | 342 Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; |
343 #ifdef DEBUG | 343 #ifdef DEBUG |
344 Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; | 344 Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; |
345 #endif // DEBUG | 345 #endif // DEBUG |
346 RecursiveMutex Isolate::process_wide_mutex_; | 346 Mutex Isolate::process_wide_mutex_; |
347 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; | 347 Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; |
348 Atomic32 Isolate::isolate_counter_ = 0; | 348 Atomic32 Isolate::isolate_counter_ = 0; |
349 | 349 |
350 Isolate::PerIsolateThreadData* Isolate::AllocatePerIsolateThreadData( | |
351 ThreadId thread_id) { | |
352 ASSERT(!thread_id.Equals(ThreadId::Invalid())); | |
353 PerIsolateThreadData* per_thread = new PerIsolateThreadData(this, thread_id); | |
354 { | |
355 LockGuard<RecursiveMutex> lock_guard(&process_wide_mutex_); | |
356 ASSERT(thread_data_table_->Lookup(this, thread_id) == NULL); | |
357 thread_data_table_->Insert(per_thread); | |
358 ASSERT(thread_data_table_->Lookup(this, thread_id) == per_thread); | |
359 } | |
360 return per_thread; | |
361 } | |
362 | |
363 | |
364 Isolate::PerIsolateThreadData* | 350 Isolate::PerIsolateThreadData* |
365 Isolate::FindOrAllocatePerThreadDataForThisThread() { | 351 Isolate::FindOrAllocatePerThreadDataForThisThread() { |
366 ThreadId thread_id = ThreadId::Current(); | 352 ThreadId thread_id = ThreadId::Current(); |
367 PerIsolateThreadData* per_thread = NULL; | 353 PerIsolateThreadData* per_thread = NULL; |
368 { | 354 { |
369 LockGuard<RecursiveMutex> lock_guard(&process_wide_mutex_); | 355 LockGuard<Mutex> lock_guard(&process_wide_mutex_); |
370 per_thread = thread_data_table_->Lookup(this, thread_id); | 356 per_thread = thread_data_table_->Lookup(this, thread_id); |
371 if (per_thread == NULL) { | 357 if (per_thread == NULL) { |
372 per_thread = AllocatePerIsolateThreadData(thread_id); | 358 per_thread = new PerIsolateThreadData(this, thread_id); |
| 359 thread_data_table_->Insert(per_thread); |
373 } | 360 } |
374 } | 361 } |
| 362 ASSERT(thread_data_table_->Lookup(this, thread_id) == per_thread); |
375 return per_thread; | 363 return per_thread; |
376 } | 364 } |
377 | 365 |
378 | 366 |
379 Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { | 367 Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { |
380 ThreadId thread_id = ThreadId::Current(); | 368 ThreadId thread_id = ThreadId::Current(); |
381 return FindPerThreadDataForThread(thread_id); | 369 return FindPerThreadDataForThread(thread_id); |
382 } | 370 } |
383 | 371 |
384 | 372 |
385 Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( | 373 Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( |
386 ThreadId thread_id) { | 374 ThreadId thread_id) { |
387 PerIsolateThreadData* per_thread = NULL; | 375 PerIsolateThreadData* per_thread = NULL; |
388 { | 376 { |
389 LockGuard<RecursiveMutex> lock_guard(&process_wide_mutex_); | 377 LockGuard<Mutex> lock_guard(&process_wide_mutex_); |
390 per_thread = thread_data_table_->Lookup(this, thread_id); | 378 per_thread = thread_data_table_->Lookup(this, thread_id); |
391 } | 379 } |
392 return per_thread; | 380 return per_thread; |
393 } | 381 } |
394 | 382 |
395 | 383 |
396 void Isolate::EnsureDefaultIsolate() { | 384 void Isolate::EnsureDefaultIsolate() { |
397 LockGuard<RecursiveMutex> lock_guard(&process_wide_mutex_); | 385 LockGuard<Mutex> lock_guard(&process_wide_mutex_); |
398 if (default_isolate_ == NULL) { | 386 if (default_isolate_ == NULL) { |
399 isolate_key_ = Thread::CreateThreadLocalKey(); | 387 isolate_key_ = Thread::CreateThreadLocalKey(); |
400 thread_id_key_ = Thread::CreateThreadLocalKey(); | 388 thread_id_key_ = Thread::CreateThreadLocalKey(); |
401 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); | 389 per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); |
402 #ifdef DEBUG | 390 #ifdef DEBUG |
403 PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey(); | 391 PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey(); |
404 #endif // DEBUG | 392 #endif // DEBUG |
405 thread_data_table_ = new Isolate::ThreadDataTable(); | 393 thread_data_table_ = new Isolate::ThreadDataTable(); |
406 default_isolate_ = new Isolate(); | 394 default_isolate_ = new Isolate(); |
407 } | 395 } |
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 | 1698 |
1711 | 1699 |
1712 void Isolate::ThreadDataTable::Remove(PerIsolateThreadData* data) { | 1700 void Isolate::ThreadDataTable::Remove(PerIsolateThreadData* data) { |
1713 if (list_ == data) list_ = data->next_; | 1701 if (list_ == data) list_ = data->next_; |
1714 if (data->next_ != NULL) data->next_->prev_ = data->prev_; | 1702 if (data->next_ != NULL) data->next_->prev_ = data->prev_; |
1715 if (data->prev_ != NULL) data->prev_->next_ = data->next_; | 1703 if (data->prev_ != NULL) data->prev_->next_ = data->next_; |
1716 delete data; | 1704 delete data; |
1717 } | 1705 } |
1718 | 1706 |
1719 | 1707 |
1720 void Isolate::ThreadDataTable::Remove(Isolate* isolate, | |
1721 ThreadId thread_id) { | |
1722 PerIsolateThreadData* data = Lookup(isolate, thread_id); | |
1723 if (data != NULL) { | |
1724 Remove(data); | |
1725 } | |
1726 } | |
1727 | |
1728 | |
1729 void Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) { | 1708 void Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) { |
1730 PerIsolateThreadData* data = list_; | 1709 PerIsolateThreadData* data = list_; |
1731 while (data != NULL) { | 1710 while (data != NULL) { |
1732 PerIsolateThreadData* next = data->next_; | 1711 PerIsolateThreadData* next = data->next_; |
1733 if (data->isolate() == isolate) Remove(data); | 1712 if (data->isolate() == isolate) Remove(data); |
1734 data = next; | 1713 data = next; |
1735 } | 1714 } |
1736 } | 1715 } |
1737 | 1716 |
1738 | 1717 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1857 // Temporarily set this isolate as current so that various parts of | 1836 // Temporarily set this isolate as current so that various parts of |
1858 // the isolate can access it in their destructors without having a | 1837 // the isolate can access it in their destructors without having a |
1859 // direct pointer. We don't use Enter/Exit here to avoid | 1838 // direct pointer. We don't use Enter/Exit here to avoid |
1860 // initializing the thread data. | 1839 // initializing the thread data. |
1861 PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); | 1840 PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); |
1862 Isolate* saved_isolate = UncheckedCurrent(); | 1841 Isolate* saved_isolate = UncheckedCurrent(); |
1863 SetIsolateThreadLocals(this, NULL); | 1842 SetIsolateThreadLocals(this, NULL); |
1864 | 1843 |
1865 Deinit(); | 1844 Deinit(); |
1866 | 1845 |
1867 { LockGuard<RecursiveMutex> lock_guard(&process_wide_mutex_); | 1846 { LockGuard<Mutex> lock_guard(&process_wide_mutex_); |
1868 thread_data_table_->RemoveAllThreads(this); | 1847 thread_data_table_->RemoveAllThreads(this); |
1869 } | 1848 } |
1870 | 1849 |
1871 if (serialize_partial_snapshot_cache_ != NULL) { | 1850 if (serialize_partial_snapshot_cache_ != NULL) { |
1872 delete[] serialize_partial_snapshot_cache_; | 1851 delete[] serialize_partial_snapshot_cache_; |
1873 serialize_partial_snapshot_cache_ = NULL; | 1852 serialize_partial_snapshot_cache_ = NULL; |
1874 } | 1853 } |
1875 | 1854 |
1876 if (!IsDefaultIsolate()) { | 1855 if (!IsDefaultIsolate()) { |
1877 delete this; | 1856 delete this; |
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2534 | 2513 |
2535 #ifdef DEBUG | 2514 #ifdef DEBUG |
2536 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ | 2515 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
2537 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); | 2516 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |
2538 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) | 2517 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) |
2539 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) | 2518 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) |
2540 #undef ISOLATE_FIELD_OFFSET | 2519 #undef ISOLATE_FIELD_OFFSET |
2541 #endif | 2520 #endif |
2542 | 2521 |
2543 } } // namespace v8::internal | 2522 } } // namespace v8::internal |
OLD | NEW |