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 1529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); | 1540 PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); |
1541 Isolate* saved_isolate = UncheckedCurrent(); | 1541 Isolate* saved_isolate = UncheckedCurrent(); |
1542 SetIsolateThreadLocals(this, NULL); | 1542 SetIsolateThreadLocals(this, NULL); |
1543 | 1543 |
1544 Deinit(); | 1544 Deinit(); |
1545 | 1545 |
1546 { ScopedLock lock(process_wide_mutex_); | 1546 { ScopedLock lock(process_wide_mutex_); |
1547 thread_data_table_->RemoveAllThreads(this); | 1547 thread_data_table_->RemoveAllThreads(this); |
1548 } | 1548 } |
1549 | 1549 |
| 1550 if (serialize_partial_snapshot_cache_ != NULL) { |
| 1551 delete[] serialize_partial_snapshot_cache_; |
| 1552 serialize_partial_snapshot_cache_ = NULL; |
| 1553 } |
| 1554 |
1550 if (!IsDefaultIsolate()) { | 1555 if (!IsDefaultIsolate()) { |
1551 delete this; | 1556 delete this; |
1552 } | 1557 } |
1553 | 1558 |
1554 // Restore the previous current isolate. | 1559 // Restore the previous current isolate. |
1555 SetIsolateThreadLocals(saved_isolate, saved_data); | 1560 SetIsolateThreadLocals(saved_isolate, saved_data); |
1556 } | 1561 } |
1557 | 1562 |
1558 | 1563 |
1559 void Isolate::Deinit() { | 1564 void Isolate::Deinit() { |
(...skipping 28 matching lines...) Expand all Loading... |
1588 } | 1593 } |
1589 heap_.TearDown(); | 1594 heap_.TearDown(); |
1590 logger_->TearDown(); | 1595 logger_->TearDown(); |
1591 | 1596 |
1592 // The default isolate is re-initializable due to legacy API. | 1597 // The default isolate is re-initializable due to legacy API. |
1593 state_ = UNINITIALIZED; | 1598 state_ = UNINITIALIZED; |
1594 } | 1599 } |
1595 } | 1600 } |
1596 | 1601 |
1597 | 1602 |
| 1603 void Isolate::PushToPartialSnapshotCache(Object* obj) { |
| 1604 int length = serialize_partial_snapshot_cache_length(); |
| 1605 int capacity = serialize_partial_snapshot_cache_capacity(); |
| 1606 |
| 1607 if (length >= capacity) { |
| 1608 int new_capacity = (capacity + 10) * 1.2; |
| 1609 Object** new_array = new Object*[new_capacity]; |
| 1610 for (int i = 0; i < length; i++) { |
| 1611 new_array[i] = serialize_partial_snapshot_cache()[i]; |
| 1612 } |
| 1613 if (capacity != 0) delete[] serialize_partial_snapshot_cache(); |
| 1614 set_serialize_partial_snapshot_cache(new_array); |
| 1615 set_serialize_partial_snapshot_cache_capacity(new_capacity); |
| 1616 } |
| 1617 |
| 1618 serialize_partial_snapshot_cache()[length] = obj; |
| 1619 set_serialize_partial_snapshot_cache_length(length + 1); |
| 1620 } |
| 1621 |
| 1622 |
1598 void Isolate::SetIsolateThreadLocals(Isolate* isolate, | 1623 void Isolate::SetIsolateThreadLocals(Isolate* isolate, |
1599 PerIsolateThreadData* data) { | 1624 PerIsolateThreadData* data) { |
1600 Thread::SetThreadLocal(isolate_key_, isolate); | 1625 Thread::SetThreadLocal(isolate_key_, isolate); |
1601 Thread::SetThreadLocal(per_isolate_thread_data_key_, data); | 1626 Thread::SetThreadLocal(per_isolate_thread_data_key_, data); |
1602 } | 1627 } |
1603 | 1628 |
1604 | 1629 |
1605 Isolate::~Isolate() { | 1630 Isolate::~Isolate() { |
1606 TRACE_ISOLATE(destructor); | 1631 TRACE_ISOLATE(destructor); |
1607 | 1632 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1805 } | 1830 } |
1806 | 1831 |
1807 // SetUp the object heap. | 1832 // SetUp the object heap. |
1808 const bool create_heap_objects = (des == NULL); | 1833 const bool create_heap_objects = (des == NULL); |
1809 ASSERT(!heap_.HasBeenSetUp()); | 1834 ASSERT(!heap_.HasBeenSetUp()); |
1810 if (!heap_.SetUp(create_heap_objects)) { | 1835 if (!heap_.SetUp(create_heap_objects)) { |
1811 V8::SetFatalError(); | 1836 V8::SetFatalError(); |
1812 return false; | 1837 return false; |
1813 } | 1838 } |
1814 | 1839 |
| 1840 if (create_heap_objects) { |
| 1841 // Terminate the cache array with the sentinel so we can iterate. |
| 1842 PushToPartialSnapshotCache(heap_.undefined_value()); |
| 1843 } |
| 1844 |
1815 InitializeThreadLocal(); | 1845 InitializeThreadLocal(); |
1816 | 1846 |
1817 bootstrapper_->Initialize(create_heap_objects); | 1847 bootstrapper_->Initialize(create_heap_objects); |
1818 builtins_.SetUp(create_heap_objects); | 1848 builtins_.SetUp(create_heap_objects); |
1819 | 1849 |
1820 // Only preallocate on the first initialization. | 1850 // Only preallocate on the first initialization. |
1821 if (FLAG_preallocate_message_memory && preallocated_message_space_ == NULL) { | 1851 if (FLAG_preallocate_message_memory && preallocated_message_space_ == NULL) { |
1822 // Start the thread which will set aside some memory. | 1852 // Start the thread which will set aside some memory. |
1823 PreallocatedMemoryThreadStart(); | 1853 PreallocatedMemoryThreadStart(); |
1824 preallocated_message_space_ = | 1854 preallocated_message_space_ = |
1825 new NoAllocationStringAllocator( | 1855 new NoAllocationStringAllocator( |
1826 preallocated_memory_thread_->data(), | 1856 preallocated_memory_thread_->data(), |
1827 preallocated_memory_thread_->length()); | 1857 preallocated_memory_thread_->length()); |
1828 PreallocatedStorageInit(preallocated_memory_thread_->length() / 4); | 1858 PreallocatedStorageInit(preallocated_memory_thread_->length() / 4); |
1829 } | 1859 } |
1830 | 1860 |
1831 if (FLAG_preemption) { | 1861 if (FLAG_preemption) { |
1832 v8::Locker locker; | 1862 v8::Locker locker; |
1833 v8::Locker::StartPreemption(100); | 1863 v8::Locker::StartPreemption(100); |
1834 } | 1864 } |
1835 | 1865 |
1836 #ifdef ENABLE_DEBUGGER_SUPPORT | 1866 #ifdef ENABLE_DEBUGGER_SUPPORT |
1837 debug_->SetUp(create_heap_objects); | 1867 debug_->SetUp(create_heap_objects); |
1838 #endif | 1868 #endif |
1839 | 1869 |
1840 // If we are deserializing, read the state into the now-empty heap. | 1870 // If we are deserializing, read the state into the now-empty heap. |
1841 if (des != NULL) { | 1871 if (!create_heap_objects) { |
1842 des->Deserialize(); | 1872 des->Deserialize(); |
1843 } | 1873 } |
1844 stub_cache_->Initialize(); | 1874 stub_cache_->Initialize(); |
1845 | 1875 |
1846 // Finish initialization of ThreadLocal after deserialization is done. | 1876 // Finish initialization of ThreadLocal after deserialization is done. |
1847 clear_pending_exception(); | 1877 clear_pending_exception(); |
1848 clear_pending_message(); | 1878 clear_pending_message(); |
1849 clear_scheduled_exception(); | 1879 clear_scheduled_exception(); |
1850 | 1880 |
1851 // Deserializing may put strange things in the root array's copy of the | 1881 // Deserializing may put strange things in the root array's copy of the |
1852 // stack guard. | 1882 // stack guard. |
1853 heap_.SetStackLimits(); | 1883 heap_.SetStackLimits(); |
1854 | 1884 |
1855 // Quiet the heap NaN if needed on target platform. | 1885 // Quiet the heap NaN if needed on target platform. |
1856 if (des != NULL) Assembler::QuietNaN(heap_.nan_value()); | 1886 if (create_heap_objects) Assembler::QuietNaN(heap_.nan_value()); |
1857 | 1887 |
1858 deoptimizer_data_ = new DeoptimizerData; | 1888 deoptimizer_data_ = new DeoptimizerData; |
1859 runtime_profiler_ = new RuntimeProfiler(this); | 1889 runtime_profiler_ = new RuntimeProfiler(this); |
1860 runtime_profiler_->SetUp(); | 1890 runtime_profiler_->SetUp(); |
1861 | 1891 |
1862 // If we are deserializing, log non-function code objects and compiled | 1892 // If we are deserializing, log non-function code objects and compiled |
1863 // functions found in the snapshot. | 1893 // functions found in the snapshot. |
1864 if (des != NULL && (FLAG_log_code || FLAG_ll_prof)) { | 1894 if (create_heap_objects && (FLAG_log_code || FLAG_ll_prof)) { |
1865 HandleScope scope; | 1895 HandleScope scope; |
1866 LOG(this, LogCodeObjects()); | 1896 LOG(this, LogCodeObjects()); |
1867 LOG(this, LogCompiledFunctions()); | 1897 LOG(this, LogCompiledFunctions()); |
1868 } | 1898 } |
1869 | 1899 |
1870 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, state_)), | 1900 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, state_)), |
1871 Internals::kIsolateStateOffset); | 1901 Internals::kIsolateStateOffset); |
1872 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, embedder_data_)), | 1902 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, embedder_data_)), |
1873 Internals::kIsolateEmbedderDataOffset); | 1903 Internals::kIsolateEmbedderDataOffset); |
1874 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.roots_)), | 1904 CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.roots_)), |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1961 | 1991 |
1962 #ifdef DEBUG | 1992 #ifdef DEBUG |
1963 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ | 1993 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
1964 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); | 1994 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |
1965 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) | 1995 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) |
1966 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) | 1996 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) |
1967 #undef ISOLATE_FIELD_OFFSET | 1997 #undef ISOLATE_FIELD_OFFSET |
1968 #endif | 1998 #endif |
1969 | 1999 |
1970 } } // namespace v8::internal | 2000 } } // namespace v8::internal |
OLD | NEW |