diff options
Diffstat (limited to 'Source/JavaScriptCore/heap')
-rw-r--r-- | Source/JavaScriptCore/heap/HeapTimer.cpp | 25 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/HeapTimer.h | 25 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 50 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.h | 26 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/MachineStackMarker.cpp | 15 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/MachineStackMarker.h | 4 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/MarkedAllocator.cpp | 6 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/MarkedSpace.cpp | 57 | ||||
-rw-r--r-- | Source/JavaScriptCore/heap/MarkedSpace.h | 3 |
9 files changed, 159 insertions, 52 deletions
diff --git a/Source/JavaScriptCore/heap/HeapTimer.cpp b/Source/JavaScriptCore/heap/HeapTimer.cpp index bc42032f5..b4d928a34 100644 --- a/Source/JavaScriptCore/heap/HeapTimer.cpp +++ b/Source/JavaScriptCore/heap/HeapTimer.cpp @@ -1,3 +1,28 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include "config.h" #include "HeapTimer.h" diff --git a/Source/JavaScriptCore/heap/HeapTimer.h b/Source/JavaScriptCore/heap/HeapTimer.h index ccd6ba8c5..fea013975 100644 --- a/Source/JavaScriptCore/heap/HeapTimer.h +++ b/Source/JavaScriptCore/heap/HeapTimer.h @@ -1,3 +1,28 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef HeapTimer_h #define HeapTimer_h diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp index 0d0116f42..165bfeaff 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp @@ -1,3 +1,28 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include "config.h" #include "IncrementalSweeper.h" @@ -14,9 +39,10 @@ namespace JSC { #if USE(CF) -static const CFTimeInterval sweepTimeSlicePerBlock = 0.01; -static const CFTimeInterval sweepTimeMultiplier = 1.0 / sweepTimeSlicePerBlock; - +static const CFTimeInterval sweepTimeSlice = .01; // seconds +static const CFTimeInterval sweepTimeTotal = .10; +static const CFTimeInterval sweepTimeMultiplier = 1.0 / sweepTimeTotal; + void IncrementalSweeper::doWork() { APIEntryShim shim(m_globalData); @@ -26,7 +52,6 @@ void IncrementalSweeper::doWork() IncrementalSweeper::IncrementalSweeper(Heap* heap, CFRunLoopRef runLoop) : HeapTimer(heap->globalData(), runLoop) , m_currentBlockToSweepIndex(0) - , m_lengthOfLastSweepIncrement(0.0) { } @@ -37,7 +62,7 @@ PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) void IncrementalSweeper::scheduleTimer() { - CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (m_lengthOfLastSweepIncrement * sweepTimeMultiplier)); + CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); } void IncrementalSweeper::cancelTimer() @@ -47,14 +72,17 @@ void IncrementalSweeper::cancelTimer() void IncrementalSweeper::doSweep(double sweepBeginTime) { - for (; m_currentBlockToSweepIndex < m_blocksToSweep.size(); m_currentBlockToSweepIndex++) { - MarkedBlock* nextBlock = m_blocksToSweep[m_currentBlockToSweepIndex]; - if (!nextBlock->needsSweeping()) + while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { + MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; + if (!block->needsSweeping()) + continue; + + block->sweep(); + + CFTimeInterval elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; + if (elapsedTime < sweepTimeSlice) continue; - nextBlock->sweep(); - m_blocksToSweep[m_currentBlockToSweepIndex++] = 0; - m_lengthOfLastSweepIncrement = WTF::monotonicallyIncreasingTime() - sweepBeginTime; scheduleTimer(); return; } diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.h b/Source/JavaScriptCore/heap/IncrementalSweeper.h index 80d674ca9..20f4e3ca8 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.h +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.h @@ -1,3 +1,28 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef IncrementalSweeper_h #define IncrementalSweeper_h @@ -27,7 +52,6 @@ private: void cancelTimer(); unsigned m_currentBlockToSweepIndex; - double m_lengthOfLastSweepIncrement; Vector<MarkedBlock*> m_blocksToSweep; #else diff --git a/Source/JavaScriptCore/heap/MachineStackMarker.cpp b/Source/JavaScriptCore/heap/MachineStackMarker.cpp index 06190f118..7eb57479b 100644 --- a/Source/JavaScriptCore/heap/MachineStackMarker.cpp +++ b/Source/JavaScriptCore/heap/MachineStackMarker.cpp @@ -45,7 +45,6 @@ #elif OS(UNIX) -#include <stdlib.h> #include <sys/mman.h> #include <unistd.h> @@ -142,8 +141,10 @@ MachineThreads::MachineThreads(Heap* heap) MachineThreads::~MachineThreads() { - if (m_threadSpecific) - ThreadSpecificKeyDelete(m_threadSpecific); + if (m_threadSpecific) { + int error = pthread_key_delete(m_threadSpecific); + ASSERT_UNUSED(error, !error); + } MutexLocker registeredThreadsLock(m_registeredThreadsMutex); for (Thread* t = m_registeredThreads; t;) { @@ -180,17 +181,19 @@ void MachineThreads::makeUsableFromMultipleThreads() if (m_threadSpecific) return; - ThreadSpecificKeyCreate(&m_threadSpecific, removeThread); + int error = pthread_key_create(&m_threadSpecific, removeThread); + if (error) + CRASH(); } void MachineThreads::addCurrentThread() { ASSERT(!m_heap->globalData()->exclusiveThread || m_heap->globalData()->exclusiveThread == currentThread()); - if (!m_threadSpecific || ThreadSpecificGet(m_threadSpecific)) + if (!m_threadSpecific || pthread_getspecific(m_threadSpecific)) return; - ThreadSpecificSet(m_threadSpecific, this); + pthread_setspecific(m_threadSpecific, this); Thread* thread = new Thread(getCurrentPlatformThread(), wtfThreadData().stack().origin()); MutexLocker lock(m_registeredThreadsMutex); diff --git a/Source/JavaScriptCore/heap/MachineStackMarker.h b/Source/JavaScriptCore/heap/MachineStackMarker.h index 2209f97e9..0f5a4c3aa 100644 --- a/Source/JavaScriptCore/heap/MachineStackMarker.h +++ b/Source/JavaScriptCore/heap/MachineStackMarker.h @@ -22,8 +22,8 @@ #ifndef MachineThreads_h #define MachineThreads_h +#include <pthread.h> #include <wtf/Noncopyable.h> -#include <wtf/ThreadSpecific.h> #include <wtf/ThreadingPrimitives.h> namespace JSC { @@ -55,7 +55,7 @@ namespace JSC { Heap* m_heap; Mutex m_registeredThreadsMutex; Thread* m_registeredThreads; - WTF::ThreadSpecificKey m_threadSpecific; + pthread_key_t m_threadSpecific; }; } // namespace JSC diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.cpp b/Source/JavaScriptCore/heap/MarkedAllocator.cpp index 9552a54ea..9cac906a1 100644 --- a/Source/JavaScriptCore/heap/MarkedAllocator.cpp +++ b/Source/JavaScriptCore/heap/MarkedAllocator.cpp @@ -107,8 +107,10 @@ void MarkedAllocator::addBlock(MarkedBlock* block) void MarkedAllocator::removeBlock(MarkedBlock* block) { - if (m_currentBlock == block) - m_currentBlock = 0; + if (m_currentBlock == block) { + m_currentBlock = static_cast<MarkedBlock*>(m_currentBlock->next()); + m_freeList = MarkedBlock::FreeList(); + } m_blockList.remove(block); } diff --git a/Source/JavaScriptCore/heap/MarkedSpace.cpp b/Source/JavaScriptCore/heap/MarkedSpace.cpp index 42247a385..a742d8d9a 100644 --- a/Source/JavaScriptCore/heap/MarkedSpace.cpp +++ b/Source/JavaScriptCore/heap/MarkedSpace.cpp @@ -30,38 +30,37 @@ namespace JSC { class Structure; -class Take { +class Free { public: typedef MarkedBlock* ReturnType; - enum TakeMode { TakeIfEmpty, TakeAll }; + enum FreeMode { FreeOrShrink, FreeAll }; - Take(TakeMode, MarkedSpace*); + Free(FreeMode, MarkedSpace*); void operator()(MarkedBlock*); ReturnType returnValue(); private: - TakeMode m_takeMode; + FreeMode m_freeMode; MarkedSpace* m_markedSpace; DoublyLinkedList<MarkedBlock> m_blocks; }; -inline Take::Take(TakeMode takeMode, MarkedSpace* newSpace) - : m_takeMode(takeMode) +inline Free::Free(FreeMode freeMode, MarkedSpace* newSpace) + : m_freeMode(freeMode) , m_markedSpace(newSpace) { } -inline void Take::operator()(MarkedBlock* block) +inline void Free::operator()(MarkedBlock* block) { - if (m_takeMode == TakeIfEmpty && !block->isEmpty()) - return; - - m_markedSpace->allocatorFor(block).removeBlock(block); - m_blocks.append(block); + if (m_freeMode == FreeOrShrink) + m_markedSpace->freeOrShrinkBlock(block); + else + m_markedSpace->freeBlock(block); } -inline Take::ReturnType Take::returnValue() +inline Free::ReturnType Free::returnValue() { return m_blocks.head(); } @@ -93,9 +92,8 @@ MarkedSpace::MarkedSpace(Heap* heap) MarkedSpace::~MarkedSpace() { - // We record a temporary list of empties to avoid modifying m_blocks while iterating it. - Take take(Take::TakeAll, this); - freeBlocks(forEachBlock(take)); + Free free(Free::FreeAll, this); + forEachBlock(free); } struct LastChanceToFinalize : MarkedBlock::VoidFunctor { @@ -160,17 +158,21 @@ bool MarkedSpace::isPagedOut(double deadline) return false; } -void MarkedSpace::freeBlocks(MarkedBlock* head) +void MarkedSpace::freeBlock(MarkedBlock* block) { - MarkedBlock* next; - for (MarkedBlock* block = head; block; block = next) { - next = static_cast<MarkedBlock*>(block->next()); - - m_blocks.remove(block); - block->sweep(); + allocatorFor(block).removeBlock(block); + m_blocks.remove(block); + m_heap->blockAllocator().deallocate(MarkedBlock::destroy(block)); +} - m_heap->blockAllocator().deallocate(MarkedBlock::destroy(block)); +void MarkedSpace::freeOrShrinkBlock(MarkedBlock* block) +{ + if (!block->isEmpty()) { + block->shrink(); + return; } + + freeBlock(block); } struct Shrink : MarkedBlock::VoidFunctor { @@ -179,11 +181,8 @@ struct Shrink : MarkedBlock::VoidFunctor { void MarkedSpace::shrink() { - // We record a temporary list of empties to avoid modifying m_blocks while iterating it. - Take takeIfEmpty(Take::TakeIfEmpty, this); - freeBlocks(forEachBlock(takeIfEmpty)); - - forEachBlock<Shrink>(); + Free freeOrShrink(Free::FreeOrShrink, this); + forEachBlock(freeOrShrink); } #if ENABLE(GGC) diff --git a/Source/JavaScriptCore/heap/MarkedSpace.h b/Source/JavaScriptCore/heap/MarkedSpace.h index 3f82bac96..62d4e5d9e 100644 --- a/Source/JavaScriptCore/heap/MarkedSpace.h +++ b/Source/JavaScriptCore/heap/MarkedSpace.h @@ -98,7 +98,8 @@ public: template<typename Functor> typename Functor::ReturnType forEachBlock(); void shrink(); - void freeBlocks(MarkedBlock* head); + void freeBlock(MarkedBlock*); + void freeOrShrinkBlock(MarkedBlock*); void didAddBlock(MarkedBlock*); void didConsumeFreeList(MarkedBlock*); |