Changeset 28110 in webkit for trunk/JavaScriptCore/kjs/collector.cpp
- Timestamp:
- Nov 28, 2007, 5:12:03 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/collector.cpp
r28106 r28110 27 27 #include "internal.h" 28 28 #include "list.h" 29 #include "MarkStack.h"30 29 #include "value.h" 31 30 #include <algorithm> … … 279 278 targetBlock = (Block*)allocateBlock(); 280 279 targetBlock->freeList = targetBlock->cells; 281 if (heapType == PrimaryHeap)282 targetBlock->mayHaveRefs = 1;283 280 targetBlockUsedCells = 0; 284 281 heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock; … … 483 480 #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) 484 481 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) 482 void Collector::markStackObjectsConservatively(void *start, void *end) 493 483 { 494 484 if (start > end) { … … 532 522 if (((CollectorCell*)xAsBits)->u.freeCell.zeroIfFree != 0) { 533 523 JSCell* imp = reinterpret_cast<JSCell*>(xAsBits); 534 stack.push(imp);535 drainMarkStack(stack);524 if (!imp->marked()) 525 imp->mark(); 536 526 } 537 527 break; … … 544 534 } 545 535 546 void Collector::markCurrentThreadConservatively( MarkStack& stack)536 void Collector::markCurrentThreadConservatively() 547 537 { 548 538 // setjmp forces volatile registers onto the stack … … 561 551 void* stackBase = currentThreadStackBase(); 562 552 563 markStackObjectsConservatively(stack , stackPointer, stackBase);553 markStackObjectsConservatively(stackPointer, stackBase); 564 554 } 565 555 … … 704 694 } 705 695 706 void Collector::markOtherThreadConservatively( MarkStack& stack,Thread* thread)696 void Collector::markOtherThreadConservatively(Thread* thread) 707 697 { 708 698 suspendThread(thread->platformThread); … … 712 702 713 703 // mark the thread's registers 714 markStackObjectsConservatively( stack,(void*)®s, (void*)((char*)®s + regSize));704 markStackObjectsConservatively((void*)®s, (void*)((char*)®s + regSize)); 715 705 716 706 void* stackPointer = otherThreadStackPointer(regs); 717 707 void* stackBase = otherThreadStackBase(regs, thread); 718 markStackObjectsConservatively(stack , stackPointer, stackBase);708 markStackObjectsConservatively(stackPointer, stackBase); 719 709 720 710 resumeThread(thread->platformThread); … … 723 713 #endif 724 714 725 void Collector::markStackObjectsConservatively( MarkStack& stack)726 { 727 markCurrentThreadConservatively( stack);715 void Collector::markStackObjectsConservatively() 716 { 717 markCurrentThreadConservatively(); 728 718 729 719 #if USE(MULTIPLE_THREADS) 730 720 for (Thread *thread = registeredThreads; thread != NULL; thread = thread->next) { 731 721 if (!pthread_equal(thread->posixThread, pthread_self())) { 732 markOtherThreadConservatively(stack,thread);722 markOtherThreadConservatively(thread); 733 723 } 734 724 } … … 782 772 } 783 773 784 void Collector::markProtectedObjects( MarkStack& stack)774 void Collector::markProtectedObjects() 785 775 { 786 776 ProtectCountSet& protectedValues = KJS::protectedValues(); 787 777 ProtectCountSet::iterator end = protectedValues.end(); 788 778 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 785 void Collector::markMainThreadOnlyObjects() 795 786 { 796 787 #if USE(MULTIPLE_THREADS) … … 824 815 if (!curBlock->marked.get(i)) { 825 816 JSCell* imp = reinterpret_cast<JSCell*>(cell); 826 stack.push(imp); 827 drainMarkStack(stack); 817 imp->mark(); 828 818 } 829 819 if (++count == mainThreadOnlyObjectCount) … … 961 951 // MARK: first mark all referenced objects recursively starting out from the set of root objects 962 952 963 size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects;964 965 MarkStack stack;966 stack.reserveCapacity(primaryHeap.numLiveObjects);967 968 953 #ifndef NDEBUG 969 954 // Forbid malloc during the mark phase. Marking a thread suspends it, so 970 // a malloc inside mark Children() would risk a deadlock with a thread that had been955 // a malloc inside mark() would risk a deadlock with a thread that had been 971 956 // suspended while holding the malloc lock. 972 957 fastMallocForbid(); … … 976 961 Interpreter* scr = Interpreter::s_hook; 977 962 do { 978 scr->markRoots(stack); 979 drainMarkStack(stack); 963 scr->mark(); 980 964 scr = scr->next; 981 965 } while (scr != Interpreter::s_hook); 982 966 } 983 967 984 markStackObjectsConservatively(stack); 985 markProtectedObjects(stack); 986 List::markProtectedLists(stack); 987 drainMarkStack(stack); 968 markStackObjectsConservatively(); 969 markProtectedObjects(); 970 List::markProtectedLists(); 988 971 #if USE(MULTIPLE_THREADS) 989 972 if (!currentThreadIsMainThread) 990 markMainThreadOnlyObjects( stack);973 markMainThreadOnlyObjects(); 991 974 #endif 992 975 … … 995 978 #endif 996 979 980 size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects; 997 981 size_t numLiveObjects = sweep<PrimaryHeap>(currentThreadIsMainThread); 998 982 numLiveObjects += sweep<NumberHeap>(currentThreadIsMainThread);
Note:
See TracChangeset
for help on using the changeset viewer.