Ignore:
Timestamp:
Nov 28, 2007, 5:12:03 AM (18 years ago)
Author:
[email protected]
Message:

Roll out r28106 and r28108. These introduced a frequent assertion failure on page load and broke all non-Mac builds.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/collector.cpp

    r28106 r28110  
    2727#include "internal.h"
    2828#include "list.h"
    29 #include "MarkStack.h"
    3029#include "value.h"
    3130#include <algorithm>
     
    279278    targetBlock = (Block*)allocateBlock();
    280279    targetBlock->freeList = targetBlock->cells;
    281     if (heapType == PrimaryHeap)
    282         targetBlock->mayHaveRefs = 1;
    283280    targetBlockUsedCells = 0;
    284281    heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock;
     
    483480#define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0)
    484481
    485 static inline void drainMarkStack(MarkStack& stack)
    486 {
    487     while (!stack.isEmpty())
    488         stack.pop()->markChildren(stack);
    489 }
    490 
    491 
    492 void Collector::markStackObjectsConservatively(MarkStack& stack, void *start, void *end)
     482void Collector::markStackObjectsConservatively(void *start, void *end)
    493483{
    494484  if (start > end) {
     
    532522                  if (((CollectorCell*)xAsBits)->u.freeCell.zeroIfFree != 0) {
    533523                      JSCell* imp = reinterpret_cast<JSCell*>(xAsBits);
    534                       stack.push(imp);
    535                       drainMarkStack(stack);
     524                      if (!imp->marked())
     525                          imp->mark();
    536526                  }
    537527                  break;
     
    544534}
    545535
    546 void Collector::markCurrentThreadConservatively(MarkStack& stack)
     536void Collector::markCurrentThreadConservatively()
    547537{
    548538    // setjmp forces volatile registers onto the stack
     
    561551    void* stackBase = currentThreadStackBase();
    562552
    563     markStackObjectsConservatively(stack, stackPointer, stackBase);
     553    markStackObjectsConservatively(stackPointer, stackBase);
    564554}
    565555
     
    704694}
    705695
    706 void Collector::markOtherThreadConservatively(MarkStack& stack, Thread* thread)
     696void Collector::markOtherThreadConservatively(Thread* thread)
    707697{
    708698  suspendThread(thread->platformThread);
     
    712702
    713703  // mark the thread's registers
    714   markStackObjectsConservatively(stack, (void*)&regs, (void*)((char*)&regs + regSize));
     704  markStackObjectsConservatively((void*)&regs, (void*)((char*)&regs + regSize));
    715705 
    716706  void* stackPointer = otherThreadStackPointer(regs);
    717707  void* stackBase = otherThreadStackBase(regs, thread);
    718   markStackObjectsConservatively(stack, stackPointer, stackBase);
     708  markStackObjectsConservatively(stackPointer, stackBase);
    719709
    720710  resumeThread(thread->platformThread);
     
    723713#endif
    724714
    725 void Collector::markStackObjectsConservatively(MarkStack& stack)
    726 {
    727   markCurrentThreadConservatively(stack);
     715void Collector::markStackObjectsConservatively()
     716{
     717  markCurrentThreadConservatively();
    728718
    729719#if USE(MULTIPLE_THREADS)
    730720  for (Thread *thread = registeredThreads; thread != NULL; thread = thread->next) {
    731721    if (!pthread_equal(thread->posixThread, pthread_self())) {
    732         markOtherThreadConservatively(stack, thread);
     722      markOtherThreadConservatively(thread);
    733723    }
    734724  }
     
    782772}
    783773
    784 void Collector::markProtectedObjects(MarkStack& stack)
     774void Collector::markProtectedObjects()
    785775{
    786776  ProtectCountSet& protectedValues = KJS::protectedValues();
    787777  ProtectCountSet::iterator end = protectedValues.end();
    788778  for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) {
    789     stack.push(it->first);
    790     drainMarkStack(stack);
    791   }
    792 }
    793 
    794 void Collector::markMainThreadOnlyObjects(MarkStack& stack)
     779    JSCell *val = it->first;
     780    if (!val->marked())
     781      val->mark();
     782  }
     783}
     784
     785void Collector::markMainThreadOnlyObjects()
    795786{
    796787#if USE(MULTIPLE_THREADS)
     
    824815                    if (!curBlock->marked.get(i)) {
    825816                        JSCell* imp = reinterpret_cast<JSCell*>(cell);
    826                         stack.push(imp);
    827                         drainMarkStack(stack);
     817                        imp->mark();
    828818                    }
    829819                    if (++count == mainThreadOnlyObjectCount)
     
    961951  // MARK: first mark all referenced objects recursively starting out from the set of root objects
    962952
    963   size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    964 
    965   MarkStack stack;
    966   stack.reserveCapacity(primaryHeap.numLiveObjects);
    967 
    968953#ifndef NDEBUG
    969954  // Forbid malloc during the mark phase. Marking a thread suspends it, so
    970   // a malloc inside markChildren() would risk a deadlock with a thread that had been
     955  // a malloc inside mark() would risk a deadlock with a thread that had been
    971956  // suspended while holding the malloc lock.
    972957  fastMallocForbid();
     
    976961    Interpreter* scr = Interpreter::s_hook;
    977962    do {
    978       scr->markRoots(stack);
    979       drainMarkStack(stack);
     963      scr->mark();
    980964      scr = scr->next;
    981965    } while (scr != Interpreter::s_hook);
    982966  }
    983967
    984   markStackObjectsConservatively(stack);
    985   markProtectedObjects(stack);
    986   List::markProtectedLists(stack);
    987   drainMarkStack(stack);
     968  markStackObjectsConservatively();
     969  markProtectedObjects();
     970  List::markProtectedLists();
    988971#if USE(MULTIPLE_THREADS)
    989972  if (!currentThreadIsMainThread)
    990     markMainThreadOnlyObjects(stack);
     973    markMainThreadOnlyObjects();
    991974#endif
    992975
     
    995978#endif
    996979   
     980  size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    997981  size_t numLiveObjects = sweep<PrimaryHeap>(currentThreadIsMainThread);
    998982  numLiveObjects += sweep<NumberHeap>(currentThreadIsMainThread);
Note: See TracChangeset for help on using the changeset viewer.