- Revision
- 181157
- Author
- gga...@apple.com
- Date
- 2015-03-06 08:58:51 -0800 (Fri, 06 Mar 2015)
Log Message
Use FastMalloc (bmalloc) instead of BlockAllocator for GC pages
https://bugs.webkit.org/show_bug.cgi?id=140900
Reviewed by Mark Hahnenberg.
Re-landing just the CopiedBlock piece of this patch.
* heap/CopiedBlock.h:
(JSC::CopiedBlock::createNoZeroFill):
(JSC::CopiedBlock::destroy):
(JSC::CopiedBlock::create):
(JSC::CopiedBlock::CopiedBlock):
(JSC::CopiedBlock::isOversize):
(JSC::CopiedBlock::payloadEnd):
(JSC::CopiedBlock::capacity):
* heap/CopiedSpace.cpp:
(JSC::CopiedSpace::~CopiedSpace):
(JSC::CopiedSpace::tryAllocateOversize):
(JSC::CopiedSpace::tryReallocateOversize):
* heap/CopiedSpaceInlines.h:
(JSC::CopiedSpace::recycleEvacuatedBlock):
(JSC::CopiedSpace::recycleBorrowedBlock):
(JSC::CopiedSpace::allocateBlockForCopyingPhase):
(JSC::CopiedSpace::allocateBlock):
(JSC::CopiedSpace::startedCopying):
* heap/CopyWorkList.h:
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (181156 => 181157)
--- trunk/Source/_javascript_Core/ChangeLog 2015-03-06 16:30:23 UTC (rev 181156)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-03-06 16:58:51 UTC (rev 181157)
@@ -1,3 +1,32 @@
+2015-03-05 Geoffrey Garen <gga...@apple.com>
+
+ Use FastMalloc (bmalloc) instead of BlockAllocator for GC pages
+ https://bugs.webkit.org/show_bug.cgi?id=140900
+
+ Reviewed by Mark Hahnenberg.
+
+ Re-landing just the CopiedBlock piece of this patch.
+
+ * heap/CopiedBlock.h:
+ (JSC::CopiedBlock::createNoZeroFill):
+ (JSC::CopiedBlock::destroy):
+ (JSC::CopiedBlock::create):
+ (JSC::CopiedBlock::CopiedBlock):
+ (JSC::CopiedBlock::isOversize):
+ (JSC::CopiedBlock::payloadEnd):
+ (JSC::CopiedBlock::capacity):
+ * heap/CopiedSpace.cpp:
+ (JSC::CopiedSpace::~CopiedSpace):
+ (JSC::CopiedSpace::tryAllocateOversize):
+ (JSC::CopiedSpace::tryReallocateOversize):
+ * heap/CopiedSpaceInlines.h:
+ (JSC::CopiedSpace::recycleEvacuatedBlock):
+ (JSC::CopiedSpace::recycleBorrowedBlock):
+ (JSC::CopiedSpace::allocateBlockForCopyingPhase):
+ (JSC::CopiedSpace::allocateBlock):
+ (JSC::CopiedSpace::startedCopying):
+ * heap/CopyWorkList.h:
+
2015-03-06 Myles C. Maxfield <mmaxfi...@apple.com>
[iOS] SVG fonts are garbled
Modified: trunk/Source/_javascript_Core/heap/CopiedBlock.h (181156 => 181157)
--- trunk/Source/_javascript_Core/heap/CopiedBlock.h 2015-03-06 16:30:23 UTC (rev 181156)
+++ trunk/Source/_javascript_Core/heap/CopiedBlock.h 2015-03-06 16:58:51 UTC (rev 181157)
@@ -26,23 +26,26 @@
#ifndef CopiedBlock_h
#define CopiedBlock_h
-#include "BlockAllocator.h"
#include "CopyWorkList.h"
#include "HeapBlock.h"
#include "JSCJSValue.h"
#include "Options.h"
#include <wtf/Atomics.h>
+#include <wtf/DoublyLinkedList.h>
+#include <wtf/TCSpinLock.h>
namespace JSC {
class CopiedSpace;
-class CopiedBlock : public HeapBlock<CopiedBlock> {
+class CopiedBlock : public DoublyLinkedListNode<CopiedBlock> {
+ friend class WTF::DoublyLinkedListNode<CopiedBlock>;
friend class CopiedSpace;
friend class CopiedAllocator;
public:
- static CopiedBlock* create(DeadBlock*);
- static CopiedBlock* createNoZeroFill(DeadBlock*);
+ static CopiedBlock* create(size_t = blockSize);
+ static CopiedBlock* createNoZeroFill(size_t = blockSize);
+ static void destroy(CopiedBlock*);
void pin();
bool isPinned();
@@ -86,11 +89,16 @@
SpinLock& workListLock() { return m_workListLock; }
private:
- CopiedBlock(Region*);
+ CopiedBlock(size_t);
void zeroFillWilderness(); // Can be called at any time to zero-fill to the end of the block.
void checkConsistency();
+ CopiedBlock* m_prev;
+ CopiedBlock* m_next;
+
+ size_t m_capacity;
+
SpinLock m_workListLock;
std::unique_ptr<CopyWorkList> m_workList;
@@ -103,15 +111,20 @@
#endif
};
-inline CopiedBlock* CopiedBlock::createNoZeroFill(DeadBlock* block)
+inline CopiedBlock* CopiedBlock::createNoZeroFill(size_t capacity)
{
- Region* region = block->region();
- return new(NotNull, block) CopiedBlock(region);
+ return new(NotNull, fastAlignedMalloc(CopiedBlock::blockSize, capacity)) CopiedBlock(capacity);
}
-inline CopiedBlock* CopiedBlock::create(DeadBlock* block)
+inline void CopiedBlock::destroy(CopiedBlock* copiedBlock)
{
- CopiedBlock* newBlock = createNoZeroFill(block);
+ copiedBlock->~CopiedBlock();
+ fastAlignedFree(copiedBlock);
+}
+
+inline CopiedBlock* CopiedBlock::create(size_t capacity)
+{
+ CopiedBlock* newBlock = createNoZeroFill(capacity);
newBlock->zeroFillWilderness();
return newBlock;
}
@@ -128,8 +141,9 @@
#endif
}
-inline CopiedBlock::CopiedBlock(Region* region)
- : HeapBlock<CopiedBlock>(region)
+inline CopiedBlock::CopiedBlock(size_t capacity)
+ : DoublyLinkedListNode<CopiedBlock>()
+ , m_capacity(capacity)
, m_remaining(payloadCapacity())
, m_isPinned(false)
, m_isOld(false)
@@ -203,7 +217,7 @@
inline bool CopiedBlock::isOversize()
{
- return region()->isCustomSize();
+ return m_capacity != blockSize;
}
inline unsigned CopiedBlock::liveBytes()
@@ -219,7 +233,7 @@
inline char* CopiedBlock::payloadEnd()
{
- return reinterpret_cast<char*>(this) + region()->blockSize();
+ return reinterpret_cast<char*>(this) + m_capacity;
}
inline size_t CopiedBlock::payloadCapacity()
@@ -264,7 +278,7 @@
inline size_t CopiedBlock::capacity()
{
- return region()->blockSize();
+ return m_capacity;
}
inline bool CopiedBlock::hasWorkList()
Modified: trunk/Source/_javascript_Core/heap/CopiedSpace.cpp (181156 => 181157)
--- trunk/Source/_javascript_Core/heap/CopiedSpace.cpp 2015-03-06 16:30:23 UTC (rev 181156)
+++ trunk/Source/_javascript_Core/heap/CopiedSpace.cpp 2015-03-06 16:58:51 UTC (rev 181157)
@@ -45,22 +45,22 @@
CopiedSpace::~CopiedSpace()
{
while (!m_oldGen.toSpace->isEmpty())
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(m_oldGen.toSpace->removeHead()));
+ CopiedBlock::destroy(m_oldGen.toSpace->removeHead());
while (!m_oldGen.fromSpace->isEmpty())
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(m_oldGen.fromSpace->removeHead()));
+ CopiedBlock::destroy(m_oldGen.fromSpace->removeHead());
while (!m_oldGen.oversizeBlocks.isEmpty())
- m_heap->blockAllocator().deallocateCustomSize(CopiedBlock::destroy(m_oldGen.oversizeBlocks.removeHead()));
+ CopiedBlock::destroy(m_oldGen.oversizeBlocks.removeHead());
while (!m_newGen.toSpace->isEmpty())
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(m_newGen.toSpace->removeHead()));
+ CopiedBlock::destroy(m_newGen.toSpace->removeHead());
while (!m_newGen.fromSpace->isEmpty())
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(m_newGen.fromSpace->removeHead()));
+ CopiedBlock::destroy(m_newGen.fromSpace->removeHead());
while (!m_newGen.oversizeBlocks.isEmpty())
- m_heap->blockAllocator().deallocateCustomSize(CopiedBlock::destroy(m_newGen.oversizeBlocks.removeHead()));
+ CopiedBlock::destroy(m_newGen.oversizeBlocks.removeHead());
ASSERT(m_oldGen.toSpace->isEmpty());
ASSERT(m_oldGen.fromSpace->isEmpty());
@@ -99,7 +99,7 @@
{
ASSERT(isOversize(bytes));
- CopiedBlock* block = CopiedBlock::create(m_heap->blockAllocator().allocateCustomSize(sizeof(CopiedBlock) + bytes, CopiedBlock::blockSize));
+ CopiedBlock* block = CopiedBlock::create(sizeof(CopiedBlock) + bytes);
m_newGen.oversizeBlocks.push(block);
m_newGen.blockFilter.add(reinterpret_cast<Bits>(block));
m_blockSet.add(block);
@@ -110,7 +110,7 @@
*outPtr = allocator.forceAllocate(bytes);
allocator.resetCurrentBlock();
- m_heap->didAllocate(block->region()->blockSize());
+ m_heap->didAllocate(block->capacity());
return true;
}
@@ -161,7 +161,7 @@
else
m_newGen.oversizeBlocks.remove(oldBlock);
m_blockSet.remove(oldBlock);
- m_heap->blockAllocator().deallocateCustomSize(CopiedBlock::destroy(oldBlock));
+ CopiedBlock::destroy(oldBlock);
}
*ptr = newPtr;
Modified: trunk/Source/_javascript_Core/heap/CopiedSpaceInlines.h (181156 => 181157)
--- trunk/Source/_javascript_Core/heap/CopiedSpaceInlines.h 2015-03-06 16:30:23 UTC (rev 181156)
+++ trunk/Source/_javascript_Core/heap/CopiedSpaceInlines.h 2015-03-06 16:58:51 UTC (rev 181157)
@@ -106,12 +106,12 @@
else
m_oldGen.fromSpace->remove(block);
}
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(block));
+ CopiedBlock::destroy(block);
}
inline void CopiedSpace::recycleBorrowedBlock(CopiedBlock* block)
{
- m_heap->blockAllocator().deallocate(CopiedBlock::destroy(block));
+ CopiedBlock::destroy(block);
{
MutexLocker locker(m_loanedBlocksLock);
@@ -126,7 +126,7 @@
inline CopiedBlock* CopiedSpace::allocateBlockForCopyingPhase()
{
ASSERT(m_inCopyingPhase);
- CopiedBlock* block = CopiedBlock::createNoZeroFill(m_heap->blockAllocator().allocate<CopiedBlock>());
+ CopiedBlock* block = CopiedBlock::createNoZeroFill();
{
MutexLocker locker(m_loanedBlocksLock);
@@ -143,7 +143,7 @@
m_allocator.resetCurrentBlock();
- CopiedBlock* block = CopiedBlock::create(m_heap->blockAllocator().allocate<CopiedBlock>());
+ CopiedBlock* block = CopiedBlock::create();
m_newGen.toSpace->push(block);
m_newGen.blockFilter.add(reinterpret_cast<Bits>(block));
@@ -235,7 +235,7 @@
} else {
oversizeBlocks->remove(block);
m_blockSet.remove(block);
- m_heap->blockAllocator().deallocateCustomSize(CopiedBlock::destroy(block));
+ CopiedBlock::destroy(block);
}
block = next;
}
Modified: trunk/Source/_javascript_Core/heap/CopyWorkList.h (181156 => 181157)
--- trunk/Source/_javascript_Core/heap/CopyWorkList.h 2015-03-06 16:30:23 UTC (rev 181156)
+++ trunk/Source/_javascript_Core/heap/CopyWorkList.h 2015-03-06 16:58:51 UTC (rev 181157)
@@ -27,6 +27,7 @@
#define CopyWorkList_h
#include "CopyToken.h"
+#include <wtf/DoublyLinkedList.h>
#include <wtf/Vector.h>
namespace JSC {