Path: blob/master/runtime/gc_modron_startup/gcmspace.cpp
5985 views
/*******************************************************************************1* Copyright (c) 1991, 2019 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/212223/**24* @file25* @ingroup GC_Modron_Startup26*/2728#include "j9.h"29#include "j9cfg.h"30#include "j9protos.h"31#include "j9consts.h"32#include "modronopt.h"33#include "gcmspace.h"3435#include <string.h>3637#include "Configuration.hpp"38#if defined(J9VM_GC_REALTIME)39#include "EnvironmentRealtime.hpp"40#else41#include "EnvironmentBase.hpp"42#endif /* J9VM_GC_REALTIME */43#include "GCExtensions.hpp"44#include "Heap.hpp"45#include "MemorySpace.hpp"46#include "ObjectAllocationInterface.hpp"4748#include "mmhook_internal.h"4950extern "C" {51/**52* Shim for low level Memory Spaces allocation which only exists to create the correct fake env for internalAllocateMemorySpaceWithMaximumWithEnv.53* Provided sizes are already adjusted (aligned etc).54* @return the pointer to the list (pool) of memory spaces allocated55*/56MM_MemorySpace *57internalAllocateMemorySpaceWithMaximum(J9JavaVM * javaVM, UDATA minimumSpaceSize, UDATA minimumNewSpaceSize, UDATA initialNewSpaceSize, UDATA maximumNewSpaceSize, UDATA minimumTenureSpaceSize, UDATA initialTenureSpaceSize, UDATA maximumTenureSpaceSize, UDATA memoryMax, UDATA baseAddress, UDATA tenureFlags)58{59MM_MemorySpace *result = NULL;60MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);61if (extensions->isMetronomeGC()) {62#if defined(J9VM_GC_REALTIME)63MM_EnvironmentRealtime env(javaVM->omrVM);64result = internalAllocateMemorySpaceWithMaximumWithEnv(&env, javaVM, minimumSpaceSize, minimumNewSpaceSize, initialNewSpaceSize, maximumNewSpaceSize, minimumTenureSpaceSize, initialTenureSpaceSize, maximumTenureSpaceSize, memoryMax, baseAddress, tenureFlags);65#endif /* J9VM_GC_REALTIME */66} else {67MM_EnvironmentBase env(javaVM->omrVM);68result = internalAllocateMemorySpaceWithMaximumWithEnv(&env, javaVM, minimumSpaceSize, minimumNewSpaceSize, initialNewSpaceSize, maximumNewSpaceSize, minimumTenureSpaceSize, initialTenureSpaceSize, maximumTenureSpaceSize, memoryMax, baseAddress, tenureFlags);69}70return result;71}7273/**74* Low level Memory Spaces allocation.75* Provided sizes are already adjusted (aligned etc).76* @return the pointer to the list (pool) of memory spaces allocated77*/78MM_MemorySpace *79internalAllocateMemorySpaceWithMaximumWithEnv(MM_EnvironmentBase *env, J9JavaVM *javaVM, UDATA minimumSpaceSize, UDATA minimumNewSpaceSize, UDATA initialNewSpaceSize, UDATA maximumNewSpaceSize, UDATA minimumTenureSpaceSize, UDATA initialTenureSpaceSize, UDATA maximumTenureSpaceSize, UDATA memoryMax, UDATA baseAddress, UDATA tenureFlags)80{81MM_MemorySpace *memorySpace = NULL;82MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);83MM_Heap *heap = extensions->heap;8485/* create set of parameters and clean them */86MM_InitializationParameters parameters;87MM_Configuration *configuration = extensions->configuration;8889/*90* This function uses goto! All function-scope variables must be declared above91* this comment. Failure to do so will cause compile errors on GNU and IBM compilers.92*/93configuration->prepareParameters(javaVM->omrVM, minimumSpaceSize, minimumNewSpaceSize, initialNewSpaceSize, maximumNewSpaceSize,94minimumTenureSpaceSize, initialTenureSpaceSize, maximumTenureSpaceSize,95memoryMax, tenureFlags, ¶meters);9697memorySpace = configuration->createDefaultMemorySpace(env, heap, ¶meters);9899if(NULL == memorySpace) {100goto cleanup;101}102103if (baseAddress) {104if(!memorySpace->inflate(env)) {105goto cleanup;106}107} else {108/* TODO: remove this branch, once physical memory is created with new API */109/* defer inflation if base address is fixed */110if ((MEMORY_TYPE_FIXED & tenureFlags) != MEMORY_TYPE_FIXED) {111if(!memorySpace->inflate(env)) {112goto cleanup;113}114}115}116117TRIGGER_J9HOOK_MM_PRIVATE_HEAP_NEW(118MM_GCExtensions::getExtensions(javaVM)->privateHookInterface,119env->getOmrVMThread(),120memorySpace);121122if (NULL == heap->getDefaultMemorySpace()) {123heap->setDefaultMemorySpace(memorySpace);124}125126return memorySpace;127128cleanup:129130/* TODO: Cleanup for the memorySpace class (if necessary) */131return NULL;132}133134} /* extern "C" */135136137