Path: blob/master/runtime/gc_glue_java/ObjectModel.cpp
5990 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*******************************************************************************/2122#include <string.h>2324#include "ObjectModel.hpp"25#include "GCExtensionsBase.hpp"26#include "ModronAssertions.h"2728bool29GC_ObjectModel::initialize(MM_GCExtensionsBase *extensions)30{31bool result = true;32_javaVM = (J9JavaVM *)extensions->getOmrVM()->_language_vm;3334_mixedObjectModel = &(extensions->mixedObjectModel);35_indexableObjectModel = &(extensions->indexableObjectModel);3637#if defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS)38getObjectModelDelegate()->setCompressObjectReferences(extensions->compressObjectReferences());39#endif /* defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS) */40getObjectModelDelegate()->setMixedObjectModel(_mixedObjectModel);41getObjectModelDelegate()->setArrayObjectModel(_indexableObjectModel);4243_classClass = NULL;44_classLoaderClass = NULL;45_atomicMarkableReferenceClass = NULL;4647J9HookInterface **vmHookInterface = _javaVM->internalVMFunctions->getVMHookInterface(_javaVM);48if (NULL == vmHookInterface) {49result = false;50} else if ((*vmHookInterface)->J9HookRegisterWithCallSite(vmHookInterface, J9HOOK_VM_INTERNAL_CLASS_LOAD, internalClassLoadHook, OMR_GET_CALLSITE(), this)) {51result = false;52} else if ((*vmHookInterface)->J9HookRegisterWithCallSite(vmHookInterface, J9HOOK_VM_CLASSES_REDEFINED, classesRedefinedHook, OMR_GET_CALLSITE(), this)) {53result = false;54}5556return result;57}5859void60GC_ObjectModel::tearDown(MM_GCExtensionsBase *extensions)61{62J9HookInterface **vmHookInterface = _javaVM->internalVMFunctions->getVMHookInterface(_javaVM);63if (NULL != vmHookInterface) {64(*vmHookInterface)->J9HookUnregister(vmHookInterface, J9HOOK_VM_INTERNAL_CLASS_LOAD, internalClassLoadHook, this);65(*vmHookInterface)->J9HookUnregister(vmHookInterface, J9HOOK_VM_CLASSES_REDEFINED, classesRedefinedHook, this);66}67}6869GC_ObjectModel::ScanType70GC_ObjectModel::getSpecialClassScanType(J9Class *objectClazz)71{72ScanType result = SCAN_MIXED_OBJECT;7374/*75* check if the object is an instance of or an instance or subclass of one of the SPECIAL classes.76* Note that these could still be uninitialized objects (no corresponding VM structs)77*/78if (objectClazz == _classClass) {79/* no need to check subclasses of java.lang.Class, since it's final */80result = SCAN_CLASS_OBJECT;81} else if ((NULL != _classLoaderClass) && isSameOrSuperClassOf(_classLoaderClass, objectClazz)) {82result = SCAN_CLASSLOADER_OBJECT;83} else if ((NULL != _atomicMarkableReferenceClass) && isSameOrSuperClassOf(_atomicMarkableReferenceClass, objectClazz)) {84result = SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT;85} else {86/* some unrecognized special class? */87result = SCAN_INVALID_OBJECT;88}8990return result;91}9293void94GC_ObjectModel::internalClassLoadHook(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)95{96J9VMInternalClassLoadEvent *classLoadEvent = (J9VMInternalClassLoadEvent*)eventData;97GC_ObjectModel *objectModel = (GC_ObjectModel*)userData;98J9VMThread *vmThread = classLoadEvent->currentThread;99J9Class *clazz = classLoadEvent->clazz;100101/* we're only interested in bootstrap classes */102if (clazz->classLoader == vmThread->javaVM->systemClassLoader) {103J9ROMClass *romClass = clazz->romClass;104J9UTF8* className = J9ROMCLASS_CLASSNAME(romClass);105106const char * const atomicMarkableReference = "java/util/concurrent/atomic/AtomicMarkableReference";107const char * const javaLangClassLoader = "java/lang/ClassLoader";108const char * const javaLangClass = "java/lang/Class";109const char * const abstractOwnableSynchronizer = "java/util/concurrent/locks/AbstractOwnableSynchronizer";110111if (0 == compareUTF8Length(J9UTF8_DATA(className), J9UTF8_LENGTH(className), (U_8*)atomicMarkableReference, strlen(atomicMarkableReference))) {112clazz->classDepthAndFlags |= J9AccClassGCSpecial;113objectModel->_atomicMarkableReferenceClass = clazz;114} else if (0 == compareUTF8Length(J9UTF8_DATA(className), J9UTF8_LENGTH(className), (U_8*)javaLangClassLoader, strlen(javaLangClassLoader))) {115clazz->classDepthAndFlags |= J9AccClassGCSpecial;116objectModel->_classLoaderClass = clazz;117} else if (0 == compareUTF8Length(J9UTF8_DATA(className), J9UTF8_LENGTH(className), (U_8*)javaLangClass, strlen(javaLangClass))) {118clazz->classDepthAndFlags |= J9AccClassGCSpecial;119objectModel->_classClass = clazz;120} else if (0 == compareUTF8Length(J9UTF8_DATA(className), J9UTF8_LENGTH(className), (U_8*)abstractOwnableSynchronizer, strlen(abstractOwnableSynchronizer))) {121clazz->classDepthAndFlags |= J9AccClassOwnableSynchronizer;122}123}124}125126void127GC_ObjectModel::classesRedefinedHook(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)128{129GC_ObjectModel *objectModel = (GC_ObjectModel*)userData;130131/* update all J9Class pointers to their most current version */132if (NULL != objectModel->_atomicMarkableReferenceClass) {133objectModel->_atomicMarkableReferenceClass = J9_CURRENT_CLASS(objectModel->_atomicMarkableReferenceClass);134}135if (NULL != objectModel->_classLoaderClass) {136objectModel->_classLoaderClass = J9_CURRENT_CLASS(objectModel->_classLoaderClass);137}138if (NULL != objectModel->_classClass) {139objectModel->_classClass = J9_CURRENT_CLASS(objectModel->_classClass);140}141}142143144145146