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