void Heap::initializeLineMetadata() { for (unsigned short size = alignment; size <= smallMax; size += alignment) { unsigned short startOffset = 0; for (size_t lineNumber = 0; lineNumber < SmallPage::lineCount - 1; ++lineNumber) { unsigned short objectCount; unsigned short remainder; divideRoundingUp(static_cast<unsigned short>(SmallPage::lineSize - startOffset), size, objectCount, remainder); BASSERT(objectCount); m_smallLineMetadata[sizeClass(size)][lineNumber] = { startOffset, objectCount }; startOffset = remainder ? size - remainder : 0; } // The last line in the page rounds down instead of up because it's not allowed to overlap into its neighbor. unsigned short objectCount = static_cast<unsigned short>((SmallPage::lineSize - startOffset) / size); m_smallLineMetadata[sizeClass(size)][SmallPage::lineCount - 1] = { startOffset, objectCount }; } for (unsigned short size = smallMax + alignment; size <= mediumMax; size += alignment) { unsigned short startOffset = 0; for (size_t lineNumber = 0; lineNumber < MediumPage::lineCount - 1; ++lineNumber) { unsigned short objectCount; unsigned short remainder; divideRoundingUp(static_cast<unsigned short>(MediumPage::lineSize - startOffset), size, objectCount, remainder); BASSERT(objectCount); m_mediumLineMetadata[sizeClass(size)][lineNumber] = { startOffset, objectCount }; startOffset = remainder ? size - remainder : 0; } // The last line in the page rounds down instead of up because it's not allowed to overlap into its neighbor. unsigned short objectCount = static_cast<unsigned short>((MediumPage::lineSize - startOffset) / size); m_mediumLineMetadata[sizeClass(size)][MediumPage::lineCount - 1] = { startOffset, objectCount }; } }
Allocator::Allocator(Heap* heap, Deallocator& deallocator) : m_isBmallocEnabled(heap->environment().isBmallocEnabled()) , m_deallocator(deallocator) { for (unsigned short size = alignment; size <= mediumMax; size += alignment) m_bumpAllocators[sizeClass(size)].init(size); }
void* CGlobalAllocator::Allocate(size_t const inSize) { ZOOFARI_ASSERT(inSize > 0); // Default to nullptr void* addr(nullptr); // Get size class and round allocation size_t sizeClass(std::max(inSize, static_cast<size_t>(8))); size_t classIndex = 1; if (inSize <= CMemConst::PAGE) { // This is a small allocation. Round to the nearest power of 2 with a minimum of 8 bytes --sizeClass; sizeClass |= sizeClass >> 1; sizeClass |= sizeClass >> 2; sizeClass |= sizeClass >> 4; sizeClass |= sizeClass >> 8; sizeClass |= sizeClass >> 16; sizeClass |= sizeClass >> 32; ++sizeClass; // Calculate index of size class classIndex = CalcClassIndexSmall(sizeClass); }
void Allocator::scavenge() { for (unsigned short i = alignment; i <= mediumMax; i += alignment) { BumpAllocator& allocator = m_bumpAllocators[sizeClass(i)]; BumpRangeCache& bumpRangeCache = m_bumpRangeCaches[sizeClass(i)]; while (allocator.canAllocate()) m_deallocator.deallocate(allocator.allocate()); while (bumpRangeCache.size()) { allocator.refill(bumpRangeCache.pop()); while (allocator.canAllocate()) m_deallocator.deallocate(allocator.allocate()); } allocator.clear(); } }
QSObject QSPixmapClass::fetchValue( const QSObject *obj, const QSMember &mem ) const { if ( mem.type() == QSMember::Custom ) { switch ( mem.index() ) { case Width: return createNumber( pixmap( obj )->width() ); case Height: return createNumber( pixmap( obj )->height() ); case Rect: return rectClass()->construct( pixmap( obj )->rect() ); case Size: return sizeClass()->construct( pixmap( obj )->size() ); case Depth: return createNumber( pixmap( obj )->depth() ); default: qWarning( "QSPixmapClass::fetchValue: unhandled case" ); return createUndefined(); } } else { return QSClass::fetchValue( obj, mem ); } }