2011-02-04 Geoffrey Garen <ggaren@apple.com>
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Feb 2011 00:20:16 +0000 (00:20 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Feb 2011 00:20:16 +0000 (00:20 +0000)
        Reviewed by Oliver Hunt.

        Rolled back in r77612 with ASSERT/crash fixed.
        https://bugs.webkit.org/show_bug.cgi?id=53759

        Don't shrink the heap to 0 unconditionally. Instead, shrink to 1 if
        necessary. For now, the heap assumes that it always has at least one
        block live.

        * runtime/Heap.cpp:
        (JSC::Heap::Heap):
        (JSC::Heap::reset):
        * runtime/Heap.h:
        * runtime/MarkedSpace.cpp:
        (JSC::MarkedSpace::allocate):
        (JSC::MarkedSpace::shrinkBlocks):
        (JSC::MarkedSpace::sweep):
        (JSC::MarkedSpace::reset):
        * runtime/MarkedSpace.h:
        (JSC::MarkedSpace::highWaterMark):
        (JSC::MarkedSpace::setHighWaterMark):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@77699 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/Heap.cpp
Source/JavaScriptCore/runtime/Heap.h
Source/JavaScriptCore/runtime/MarkedSpace.cpp
Source/JavaScriptCore/runtime/MarkedSpace.h

index 35d35528b1dc6253fa369c0f5dd8fa89449f0fbb..a54012a352616847427cb63c9c7ce914c04d3713 100644 (file)
@@ -1,3 +1,27 @@
+2011-02-04  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Rolled back in r77612 with ASSERT/crash fixed.
+        https://bugs.webkit.org/show_bug.cgi?id=53759
+        
+        Don't shrink the heap to 0 unconditionally. Instead, shrink to 1 if
+        necessary. For now, the heap assumes that it always has at least one
+        block live.
+
+        * runtime/Heap.cpp:
+        (JSC::Heap::Heap):
+        (JSC::Heap::reset):
+        * runtime/Heap.h:
+        * runtime/MarkedSpace.cpp:
+        (JSC::MarkedSpace::allocate):
+        (JSC::MarkedSpace::shrinkBlocks):
+        (JSC::MarkedSpace::sweep):
+        (JSC::MarkedSpace::reset):
+        * runtime/MarkedSpace.h:
+        (JSC::MarkedSpace::highWaterMark):
+        (JSC::MarkedSpace::setHighWaterMark):
+
 2011-02-04  David Kilzer  <ddkilzer@apple.com>
 
         BUILD FIX: REALLY remove the last vestiges of JSVALUE32!
index 89cc6f82e149e9892c3b49c4367f81367ed6e9ba..72d7188b868ce653c70d59c2ac854e55a8bb778b 100644 (file)
 #include "JSLock.h"
 #include "JSONObject.h"
 #include "Tracing.h"
+#include <algorithm>
 
 #define COLLECT_ON_EVERY_ALLOCATION 0
 
+using namespace std;
+
 namespace JSC {
 
+const size_t minBytesPerCycle = 512 * 1024;
+
 Heap::Heap(JSGlobalData* globalData)
-    : m_markedSpace(globalData)
-    , m_operationInProgress(NoOperation)
+    : m_operationInProgress(NoOperation)
+    , m_markedSpace(globalData)
     , m_markListSet(0)
     , m_activityCallback(DefaultGCActivityCallback::create(this))
     , m_globalData(globalData)
@@ -381,6 +386,10 @@ void Heap::reset(SweepToggle sweepToggle)
     if (sweepToggle == DoSweep)
         m_markedSpace.sweep();
 
+    size_t usedCellCount = m_markedSpace.markedCells();
+    size_t proportionalBytes = static_cast<size_t>(usedCellCount * 1.5 * HeapConstants::cellSize);
+    m_markedSpace.setHighWaterMark(max(proportionalBytes, minBytesPerCycle));
+
     JAVASCRIPTCORE_GC_END();
 
     (*m_activityCallback)();
index a896819e8b72a071967fdd0b70cbc62dd0ece9ba..1e2f5856ffbb29e7097caf02fdaeed2f733bdd3c 100644 (file)
@@ -122,8 +122,8 @@ namespace JSC {
 
         RegisterFile& registerFile();
 
-        MarkedSpace m_markedSpace;
         OperationInProgress m_operationInProgress;
+        MarkedSpace m_markedSpace;
 
         ProtectCountSet m_protectedValues;
         Vector<PageAllocationAligned> m_weakGCHandlePools;
index 027a9731a9885d8f4da271230d869c3486668226..b2e2ee5fad5b7210b9231cedd7be3c8836fc0e12 100644 (file)
@@ -138,8 +138,12 @@ void* MarkedSpace::allocate(size_t s)
             m_heap.nextCell = block->marked.nextPossiblyUnset(m_heap.nextCell);
         } while (m_heap.nextCell != HeapConstants::cellsPerBlock);
         m_heap.nextCell = 0;
+        m_heap.waterMark += BLOCK_SIZE;
     } while (++m_heap.nextBlock != m_heap.usedBlocks);
-    
+
+    if (m_heap.waterMark < m_heap.highWaterMark)
+        return &allocateBlock()->cells[m_heap.nextCell++];
+
     return 0;
 }
 
@@ -270,6 +274,9 @@ void MarkedSpace::sweep()
         new (cell) JSCell(dummyMarkableCellStructure);
 #endif
     }
+    
+    if (m_heap.usedBlocks > 1)
+        shrinkBlocks(1);
 }
 
 size_t MarkedSpace::objectCount() const
@@ -294,10 +301,10 @@ void MarkedSpace::reset()
 {
     m_heap.nextCell = 0;
     m_heap.nextBlock = 0;
+    m_heap.waterMark = 0;
 #if ENABLE(JSC_ZOMBIES)
     sweep();
 #endif
-    resizeBlocks();
 }
 
 LiveObjectIterator MarkedSpace::primaryHeapBegin()
index a2bdb31e84329ec6d7b4874efbc2690681a89c26..ab656191ce9d0b70275c8316e1c5cde07069685f 100644 (file)
@@ -47,6 +47,9 @@ namespace JSC {
         
         size_t numBlocks;
         size_t usedBlocks;
+        
+        size_t waterMark;
+        size_t highWaterMark;
 
         MarkedBlock* collectorBlock(size_t index) const
         {
@@ -68,12 +71,16 @@ namespace JSC {
 
         JSGlobalData* globalData() { return m_globalData; }
 
+        size_t highWaterMark() { return m_heap.highWaterMark; }
+        void setHighWaterMark(size_t highWaterMark) { m_heap.highWaterMark = highWaterMark; }
+
         void* allocate(size_t);
 
         void clearMarkBits();
         void markRoots();
         void reset();
         void sweep();
+        size_t markedCells(size_t startBlock = 0, size_t startCell = 0) const;
 
         size_t size() const;
         size_t capacity() const;
@@ -94,7 +101,6 @@ namespace JSC {
         void shrinkBlocks(size_t neededBlocks);
 
         void clearMarkBits(MarkedBlock*);
-        size_t markedCells(size_t startBlock = 0, size_t startCell = 0) const;
 
         CollectorHeap m_heap;
         JSGlobalData* m_globalData;