本文整理汇总了C++中Segment::GetPageCount方法的典型用法代码示例。如果您正苦于以下问题:C++ Segment::GetPageCount方法的具体用法?C++ Segment::GetPageCount怎么用?C++ Segment::GetPageCount使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Segment
的用法示例。
在下文中一共展示了Segment::GetPageCount方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LargeAllocationVerboseTrace
LargeHeapBlock*
LargeHeapBucket::AddLargeHeapBlock(size_t size, bool nothrow)
{
Recycler* recycler = this->heapInfo->recycler;
Segment * segment;
size_t pageCount = LargeHeapBlock::GetPagesNeeded(size, this->supportFreeList);
if (pageCount == 0)
{
if (nothrow == false)
{
// overflow
// Since nothrow is false here, it's okay to throw
recycler->OutOfMemory();
}
return nullptr;
}
char * address = nullptr;
size_t realPageCount = pageCount;
address = recycler->GetRecyclerLargeBlockPageAllocator()->Alloc(&realPageCount, &segment);
pageCount = realPageCount;
if (address == nullptr)
{
return nullptr;
}
#ifdef RECYCLER_ZERO_MEM_CHECK
recycler->VerifyZeroFill(address, pageCount * AutoSystemInfo::PageSize);
#endif
uint objectCount = LargeHeapBlock::GetMaxLargeObjectCount(pageCount, size);
LargeHeapBlock * heapBlock = LargeHeapBlock::New(address, pageCount, segment, objectCount, supportFreeList ? this : nullptr);
#if DBG
LargeAllocationVerboseTrace(recycler->GetRecyclerFlagsTable(), _u("Allocated new large heap block 0x%p for sizeCat 0x%x\n"), heapBlock, sizeCat);
#endif
#ifdef ENABLE_JS_ETW
#if ENABLE_DEBUG_CONFIG_OPTIONS
if (segment->GetPageCount() > recycler->GetRecyclerLargeBlockPageAllocator()->GetMaxAllocPageCount())
{
EventWriteJSCRIPT_INTERNAL_RECYCLER_EXTRALARGE_OBJECT_ALLOC(size);
}
#endif
#endif
if (!heapBlock)
{
recycler->GetRecyclerLargeBlockPageAllocator()->SuspendIdleDecommit();
recycler->GetRecyclerLargeBlockPageAllocator()->Release(address, pageCount, segment);
recycler->GetRecyclerLargeBlockPageAllocator()->ResumeIdleDecommit();
return nullptr;
}
#if ENABLE_PARTIAL_GC
recycler->autoHeap.uncollectedNewPageCount += pageCount;
#endif
RECYCLER_SLOW_CHECK(this->heapInfo->heapBlockCount[HeapBlock::HeapBlockType::LargeBlockType]++);
heapBlock->heapInfo = this->heapInfo;
heapBlock->lastCollectAllocCount = 0;
Assert(recycler->collectionState != CollectionStateMark);
if (!recycler->heapBlockMap.SetHeapBlock(address, pageCount, heapBlock, HeapBlock::HeapBlockType::LargeBlockType, 0))
{
recycler->GetRecyclerLargeBlockPageAllocator()->SuspendIdleDecommit();
heapBlock->ReleasePages(recycler);
recycler->GetRecyclerLargeBlockPageAllocator()->ResumeIdleDecommit();
LargeHeapBlock::Delete(heapBlock);
RECYCLER_SLOW_CHECK(this->heapInfo->heapBlockCount[HeapBlock::HeapBlockType::LargeBlockType]--);
return nullptr;
}
heapBlock->SetNextBlock(this->largeBlockList);
this->largeBlockList = heapBlock;
RECYCLER_PERF_COUNTER_ADD(FreeObjectSize, heapBlock->GetPageCount() * AutoSystemInfo::PageSize);
return heapBlock;
}
示例2: if
char*
LargeHeapBucket::PageHeapAlloc(Recycler * recycler, size_t size, ObjectInfoBits attributes, PageHeapMode mode, bool nothrow)
{
size_t sizeCat = HeapInfo::GetAlignedSizeNoCheck(size);
Segment * segment;
size_t pageCount = LargeHeapBlock::GetPagesNeeded(size, this->supportFreeList);
if (pageCount == 0)
{
if (nothrow == false)
{
// overflow
// Since nothrow is false here, it's okay to throw
recycler->OutOfMemory();
}
return nullptr;
}
size_t actualPageCount = pageCount + 1; // for page heap
char * baseAddress = recycler->GetRecyclerLargeBlockPageAllocator()->Alloc(&actualPageCount, &segment);
if (baseAddress == nullptr)
{
return nullptr;
}
char* address = nullptr;
char* guardPageAddress = nullptr;
DWORD guardPageOldProtectFlags = PAGE_NOACCESS;
if (heapInfo->pageHeapMode == PageHeapMode::PageHeapModeBlockStart)
{
address = baseAddress + AutoSystemInfo::PageSize;
guardPageAddress = baseAddress;
}
else if (heapInfo->pageHeapMode == PageHeapMode::PageHeapModeBlockEnd)
{
address = baseAddress;
guardPageAddress = baseAddress + pageCount* AutoSystemInfo::PageSize;
}
else
{
AnalysisAssert(false);
}
if (::VirtualProtect(static_cast<LPVOID>(guardPageAddress), AutoSystemInfo::PageSize, PAGE_NOACCESS, &guardPageOldProtectFlags) == FALSE)
{
AssertMsg(false, "Unable to set permission for guard page.");
return nullptr;
}
#ifdef RECYCLER_ZERO_MEM_CHECK
recycler->VerifyZeroFill(address, pageCount * AutoSystemInfo::PageSize);
#endif
LargeHeapBlock * heapBlock = LargeHeapBlock::New(address, pageCount, segment, 1, nullptr);
if (!heapBlock)
{
recycler->GetRecyclerLargeBlockPageAllocator()->SuspendIdleDecommit();
recycler->GetRecyclerLargeBlockPageAllocator()->Release(address, actualPageCount, segment);
recycler->GetRecyclerLargeBlockPageAllocator()->ResumeIdleDecommit();
return nullptr;
}
heapBlock->actualPageCount = actualPageCount;
heapBlock->guardPageAddress = guardPageAddress;
heapBlock->guardPageOldProtectFlags = guardPageOldProtectFlags;
heapBlock->pageHeapMode = heapInfo->pageHeapMode;
if (heapBlock->pageHeapMode == PageHeapMode::PageHeapModeBlockEnd)
{
// TODO: pad the address to close-most to the guard page to increase the chance to hit guard page when overflow
// some Mark code need to be updated to support this
// heapBlock->SetEndAllocAddress(address
// + AutoSystemInfo::PageSize - (((AllocSizeMath::Add(sizeCat, sizeof(LargeObjectHeader)) - 1) % AutoSystemInfo::PageSize) / HeapInfo::ObjectGranularity + 1) * HeapInfo::ObjectGranularity);
}
#if DBG
LargeAllocationVerboseTrace(recycler->GetRecyclerFlagsTable(), _u("Allocated new large heap block 0x%p for sizeCat 0x%x\n"), heapBlock, sizeCat);
#endif
#ifdef ENABLE_JS_ETW
#if ENABLE_DEBUG_CONFIG_OPTIONS
if (segment->GetPageCount() > recycler->GetRecyclerLargeBlockPageAllocator()->GetMaxAllocPageCount())
{
EventWriteJSCRIPT_INTERNAL_RECYCLER_EXTRALARGE_OBJECT_ALLOC(size);
}
#endif
#endif
#if ENABLE_PARTIAL_GC
recycler->autoHeap.uncollectedNewPageCount += pageCount;
#endif
RECYCLER_SLOW_CHECK(this->heapInfo->heapBlockCount[HeapBlock::HeapBlockType::LargeBlockType]++);
heapBlock->heapInfo = this->heapInfo;
Assert(recycler->collectionState != CollectionStateMark);
//.........这里部分代码省略.........