/** * Allocate and initialize the receivers internal structures. * @return true on success, false on failure. */ bool MM_ParallelSweepChunkArray::initialize(MM_EnvironmentBase* env, bool useVmem) { bool result = false; MM_GCExtensionsBase* extensions = env->getExtensions(); _useVmem = useVmem; if (extensions->isFvtestForceSweepChunkArrayCommitFailure()) { Trc_MM_SweepHeapSectioning_parallelSweepChunkArrayCommitFailureForced(env->getLanguageVMThread()); } else { if (useVmem) { MM_MemoryManager* memoryManager = extensions->memoryManager; if (memoryManager->createVirtualMemoryForMetadata(env, &_memoryHandle, extensions->heapAlignment, _size * sizeof(MM_ParallelSweepChunk))) { void* base = memoryManager->getHeapBase(&_memoryHandle); result = memoryManager->commitMemory(&_memoryHandle, base, _size * sizeof(MM_ParallelSweepChunk)); if (!result) { Trc_MM_SweepHeapSectioning_parallelSweepChunkArrayCommitFailed(env->getLanguageVMThread(), base, _size * sizeof(MM_ParallelSweepChunk)); } _array = (MM_ParallelSweepChunk*)base; } } else { if (0 != _size) { _array = (MM_ParallelSweepChunk*)env->getForge()->allocate(_size * sizeof(MM_ParallelSweepChunk), MM_AllocationCategory::FIXED, OMR_GET_CALLSITE()); result = (NULL != _array); } else { result = true; } } } return result; }
/** * Commit the address range into physical memory. * @return true if successful, false otherwise. * @note This is a bit of a strange function to have as public API. Should it be removed? */ bool MM_HeapVirtualMemory::commitMemory(void* address, uintptr_t size) { MM_GCExtensionsBase* extensions = MM_GCExtensionsBase::getExtensions(_omrVM); MM_MemoryManager* memoryManager = extensions->memoryManager; return memoryManager->commitMemory(&_vmemHandle, address, size); }