Path: blob/master/runtime/gc_vlhgc/CopyScanCacheChunkVLHGCInHeap.cpp
5986 views
1/*******************************************************************************2* Copyright (c) 1991, 2014 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* 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-exception21*******************************************************************************/2223#include "j9.h"24#include "j9cfg.h"2526#include "CopyScanCacheVLHGC.hpp"27#include "CopyScanCacheChunkVLHGCInHeap.hpp"282930UDATA31MM_CopyScanCacheChunkVLHGCInHeap::numberOfCachesInChunk(MM_EnvironmentVLHGC *env)32{33UDATA tlhMinimumSize = MM_GCExtensions::getExtensions(env)->tlhMinimumSize;34UDATA sizeToAllocate = sizeof(MM_CopyScanCacheChunkVLHGCInHeap);35UDATA numberOfCaches = 1;3637if (sizeToAllocate < tlhMinimumSize) {38/* calculate number of caches to just barely exceed tlhMinimumSize */39numberOfCaches = ((tlhMinimumSize - sizeToAllocate) / sizeof(MM_CopyScanCacheVLHGC)) + 1;40}41return numberOfCaches;42}4344UDATA45MM_CopyScanCacheChunkVLHGCInHeap::bytesRequiredToAllocateChunkInHeap(MM_EnvironmentVLHGC *env)46{47UDATA sizeToAllocate = sizeof(MM_CopyScanCacheChunkVLHGCInHeap);48UDATA numberOfCaches = numberOfCachesInChunk(env);4950/* total size required to allocate */51sizeToAllocate += numberOfCaches * sizeof(MM_CopyScanCacheVLHGC);52/* this is going to be allocated on the heap so ensure that the chunk we are allocating is adjusted for heap alignment (since object consumed sizes already have this requirement) */53sizeToAllocate = MM_Math::roundToCeiling(env->getObjectAlignmentInBytes(), sizeToAllocate);54return sizeToAllocate;55}5657MM_CopyScanCacheChunkVLHGCInHeap *58MM_CopyScanCacheChunkVLHGCInHeap::newInstance(MM_EnvironmentVLHGC *env, void *buffer, UDATA bufferLengthInBytes, MM_CopyScanCacheVLHGC **nextCacheAddr, MM_CopyScanCacheChunkVLHGC *nextChunk)59{60/* make sure that the memory extent is exactly the right size to allocate an instance of the receiver */61Assert_MM_true(bytesRequiredToAllocateChunkInHeap(env) == bufferLengthInBytes);62MM_CopyScanCacheChunkVLHGCInHeap *chunk = (MM_CopyScanCacheChunkVLHGCInHeap *)buffer;63new(chunk) MM_CopyScanCacheChunkVLHGCInHeap();64if (!chunk->initialize(env, numberOfCachesInChunk(env), nextCacheAddr, nextChunk)) {65chunk->tearDown(env);66chunk = NULL;67}68return chunk;69}7071bool72MM_CopyScanCacheChunkVLHGCInHeap::initialize(MM_EnvironmentVLHGC *env, UDATA cacheEntryCount, MM_CopyScanCacheVLHGC **nextCacheAddr, MM_CopyScanCacheChunkVLHGC *nextChunk)73{74bool success = MM_CopyScanCacheChunkVLHGC::initialize(env, cacheEntryCount, nextCacheAddr, nextChunk);75if (success) {76MM_CopyScanCacheVLHGC *structureArrayBase = getBase();77for (UDATA i = 0; i < cacheEntryCount; i++) {78structureArrayBase[i].flags |= J9VM_MODRON_SCAVENGER_CACHE_TYPE_HEAP;79}80}81return success;82}8384void85MM_CopyScanCacheChunkVLHGCInHeap::kill(MM_EnvironmentVLHGC *env)86{87tearDown(env);88/* the receiver's memory was allocated for it in memory which does not require cleanup */89}909192