Changeset 105442 in webkit for trunk/Source/JavaScriptCore/heap/MarkStack.cpp
- Timestamp:
- Jan 19, 2012, 1:49:56 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/MarkStack.cpp
r103083 r105442 27 27 #include "MarkStack.h" 28 28 29 #include "BumpSpace.h" 30 #include "BumpSpaceInlineMethods.h" 29 31 #include "ConservativeRoots.h" 30 32 #include "Heap.h" … … 234 236 MarkStackThreadSharedData::MarkStackThreadSharedData(JSGlobalData* globalData) 235 237 : m_globalData(globalData) 238 , m_bumpSpace(&globalData->heap.m_storageSpace) 236 239 , m_sharedMarkStack(m_segmentAllocator) 237 240 , m_numberOfActiveParallelMarkers(0) … … 338 341 { 339 342 ASSERT(m_isInParallelMode); 340 343 341 344 #if ENABLE(PARALLEL_GC) 342 345 if (Options::numberOfGCMarkers > 1) { … … 399 402 while (true) { 400 403 // Did we reach termination? 401 if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) 404 if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) { 405 // Let any sleeping slaves know it's time for them to give their private BumpBlocks back 406 m_shared.m_markingCondition.broadcast(); 402 407 return; 408 } 403 409 404 410 // Is there work to be done? … … 416 422 m_shared.m_markingCondition.broadcast(); 417 423 418 while (m_shared.m_sharedMarkStack.isEmpty() && !m_shared.m_parallelMarkersShouldExit) 424 while (m_shared.m_sharedMarkStack.isEmpty() && !m_shared.m_parallelMarkersShouldExit) { 425 if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) 426 doneCopying(); 419 427 m_shared.m_markingCondition.wait(m_shared.m_markingLock); 428 } 420 429 421 430 // Is the VM exiting? If so, exit this thread. 422 if (m_shared.m_parallelMarkersShouldExit) 431 if (m_shared.m_parallelMarkersShouldExit) { 432 doneCopying(); 423 433 return; 434 } 424 435 } 425 436 426 437 m_stack.stealSomeCellsFrom(m_shared.m_sharedMarkStack); 427 438 m_shared.m_numberOfActiveParallelMarkers++; … … 446 457 } 447 458 459 void SlotVisitor::startCopying() 460 { 461 ASSERT(!m_copyBlock); 462 if (!m_shared.m_bumpSpace->borrowBlock(&m_copyBlock)) 463 CRASH(); 464 } 465 466 void* SlotVisitor::allocateNewSpace(void* ptr, size_t bytes) 467 { 468 if (BumpSpace::isOversize(bytes)) { 469 m_shared.m_bumpSpace->pin(BumpSpace::oversizeBlockFor(ptr)); 470 return 0; 471 } 472 473 if (m_shared.m_bumpSpace->isPinned(ptr)) 474 return 0; 475 476 // The only time it's possible to have a null copy block is if we have just started copying. 477 if (!m_copyBlock) 478 startCopying(); 479 480 if (!BumpSpace::fitsInBlock(m_copyBlock, bytes)) { 481 // We don't need to lock across these two calls because the master thread won't 482 // call doneCopying() because this thread is considered active. 483 m_shared.m_bumpSpace->doneFillingBlock(m_copyBlock); 484 if (!m_shared.m_bumpSpace->borrowBlock(&m_copyBlock)) 485 CRASH(); 486 } 487 return BumpSpace::allocateFromBlock(m_copyBlock, bytes); 488 } 489 490 void SlotVisitor::copy(void** ptr, size_t bytes) 491 { 492 void* newPtr = 0; 493 if (!(newPtr = allocateNewSpace(*ptr, bytes))) 494 return; 495 496 memcpy(newPtr, *ptr, bytes); 497 *ptr = newPtr; 498 } 499 500 void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsigned length) 501 { 502 void* oldPtr = *ptr; 503 void* newPtr = allocateNewSpace(oldPtr, bytes); 504 if (newPtr) { 505 size_t jsValuesOffset = static_cast<size_t>(reinterpret_cast<char*>(values) - static_cast<char*>(oldPtr)); 506 507 JSValue* newValues = reinterpret_cast<JSValue*>(static_cast<char*>(newPtr) + jsValuesOffset); 508 for (unsigned i = 0; i < length; i++) { 509 JSValue& value = values[i]; 510 newValues[i] = value; 511 if (!value) 512 continue; 513 internalAppend(value); 514 } 515 516 memcpy(newPtr, oldPtr, jsValuesOffset); 517 *ptr = newPtr; 518 } else 519 append(values, length); 520 } 521 522 void SlotVisitor::doneCopying() 523 { 524 if (!m_copyBlock) 525 return; 526 527 m_shared.m_bumpSpace->doneFillingBlock(m_copyBlock); 528 529 m_copyBlock = 0; 530 } 531 448 532 void SlotVisitor::harvestWeakReferences() 449 533 {
Note:
See TracChangeset
for help on using the changeset viewer.