Path: blob/master/runtime/gc_check/CheckFinalizableList.cpp
5985 views
/*******************************************************************************1* Copyright (c) 1991, 2014 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 "CheckEngine.hpp"23#include "CheckFinalizableList.hpp"24#include "FinalizeListManager.hpp"25#include "ModronTypes.hpp"26#include "ScanFormatter.hpp"2728#if defined(J9VM_GC_FINALIZATION)2930GC_Check *31GC_CheckFinalizableList::newInstance(J9JavaVM *javaVM, GC_CheckEngine *engine)32{33MM_Forge *forge = MM_GCExtensions::getExtensions(javaVM)->getForge();3435GC_CheckFinalizableList *check = (GC_CheckFinalizableList *) forge->allocate(sizeof(GC_CheckFinalizableList), MM_AllocationCategory::DIAGNOSTIC, J9_GET_CALLSITE());36if(check) {37new(check) GC_CheckFinalizableList(javaVM, engine);38}39return check;40}4142void43GC_CheckFinalizableList::kill()44{45MM_Forge *forge = MM_GCExtensions::getExtensions(_javaVM)->getForge();46forge->free(this);47}4849void50GC_CheckFinalizableList::check()51{52GC_FinalizeListManager *finalizeListManager = _extensions->finalizeListManager;53{54/* walk finalizable objects created by the system class loader */55j9object_t systemObject = peekSystemFinalizableObject(finalizeListManager);56while (NULL != systemObject) {57if (_engine->checkSlotFinalizableList(_javaVM, &systemObject, finalizeListManager) != J9MODRON_SLOT_ITERATOR_OK ){58return ;59}60systemObject = peekNextSystemFinalizableObject(finalizeListManager, systemObject);61}62}6364{65/* walk finalizable objects created by all other class loaders*/66j9object_t defaultObject = peekDefaultFinalizableObject(finalizeListManager);67while (NULL != defaultObject) {68if (_engine->checkSlotFinalizableList(_javaVM, &defaultObject, finalizeListManager) != J9MODRON_SLOT_ITERATOR_OK ){69return ;70}71defaultObject = peekNextDefaultFinalizableObject(finalizeListManager, defaultObject);72}73}7475{76/* walk reference objects */77j9object_t referenceObject = finalizeListManager->peekReferenceObject();78while (NULL != referenceObject) {79if (_engine->checkSlotFinalizableList(_javaVM, &referenceObject, finalizeListManager) != J9MODRON_SLOT_ITERATOR_OK ){80return ;81}82referenceObject = finalizeListManager->peekNextReferenceObject(referenceObject);83}84}85}8687void88GC_CheckFinalizableList::print()89{90GC_FinalizeListManager *finalizeListManager = _extensions->finalizeListManager;91GC_ScanFormatter formatter(_portLibrary, "finalizableList");92{93/* walk finalizable objects created by the system class loader */94formatter.section("finalizable objects created by the system classloader");95j9object_t systemObject = peekSystemFinalizableObject(finalizeListManager);96while (NULL != systemObject) {97formatter.entry((void *) systemObject);98systemObject = peekNextSystemFinalizableObject(finalizeListManager, systemObject);99}100formatter.endSection();101}102103{104formatter.section("finalizable objects created by application class loaders");105/* walk finalizable objects created by all other class loaders*/106j9object_t defaultObject = peekDefaultFinalizableObject(finalizeListManager);107while (NULL != defaultObject) {108formatter.entry((void *) defaultObject);109defaultObject = peekNextDefaultFinalizableObject(finalizeListManager, defaultObject);110}111formatter.endSection();112}113114{115formatter.section("reference objects");116/* walk reference objects */117j9object_t referenceObject = finalizeListManager->peekReferenceObject();118while (NULL != referenceObject) {119formatter.entry((void *) referenceObject);120referenceObject = finalizeListManager->peekNextReferenceObject(referenceObject);121}122formatter.endSection();123}124125formatter.end("finalizableList");126}127128j9object_t129GC_CheckFinalizableList::peekSystemFinalizableObject(GC_FinalizeListManager *finalizeListManager)130{131return finalizeListManager->_systemFinalizableObjects;132}133134j9object_t135GC_CheckFinalizableList::peekNextSystemFinalizableObject(GC_FinalizeListManager *finalizeListManager, j9object_t current)136{137MM_GCExtensions *extensions = finalizeListManager->_extensions;138MM_ObjectAccessBarrier *barrier = extensions->accessBarrier;139return barrier->getFinalizeLink(current);140}141142j9object_t143GC_CheckFinalizableList::peekDefaultFinalizableObject(GC_FinalizeListManager *finalizeListManager)144{145return finalizeListManager->_defaultFinalizableObjects;146}147148j9object_t149GC_CheckFinalizableList::peekNextDefaultFinalizableObject(GC_FinalizeListManager *finalizeListManager, j9object_t current)150{151MM_GCExtensions *extensions = finalizeListManager->_extensions;152MM_ObjectAccessBarrier *barrier = extensions->accessBarrier;153return barrier->getFinalizeLink(current);154}155156#endif /* J9VM_GC_FINALIZATION */157158159