Path: blob/master/runtime/gc_verbose_java/VerboseManagerJava.cpp
5985 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 "gcutils.h"24#include "modronnls.h"25#include "omr.h"2627#include <string.h>2829#include "EnvironmentBase.hpp"30#include "GCExtensions.hpp"31#include "VerboseManagerJava.hpp"3233#include "VerboseHandlerOutput.hpp"34#if defined(J9VM_GC_REALTIME)35#include "VerboseHandlerOutputRealtime.hpp"36#endif /* defined(J9VM_GC_REALTIME) */37#if defined(J9VM_GC_MODRON_STANDARD)38#include "VerboseHandlerOutputStandardJava.hpp"39#endif /* defined(J9VM_GC_MODRON_STANDARD) */40#if defined(J9VM_GC_VLHGC)41#include "VerboseHandlerOutputVLHGC.hpp"42#endif /* defined(J9VM_GC_VLHGC) */43#include "VerboseWriter.hpp"44#include "VerboseWriterChain.hpp"45#include "VerboseWriterFileLoggingBuffered.hpp"46#include "VerboseWriterFileLoggingSynchronous.hpp"47#include "VerboseWriterHook.hpp"48#include "VerboseWriterStreamOutput.hpp"49#include "VerboseWriterTrace.hpp"5051/**52* Create a new MM_VerboseManagerJava instance.53* @return Pointer to the new MM_VerboseManagerJava.54*/55MM_VerboseManager *56MM_VerboseManagerJava::newInstance(MM_EnvironmentBase *env, OMR_VM* vm)57{58MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(vm);5960MM_VerboseManagerJava *verboseManager = (MM_VerboseManagerJava *)extensions->getForge()->allocate(sizeof(MM_VerboseManagerJava), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());61if (verboseManager) {62new(verboseManager) MM_VerboseManagerJava(vm);63if(!verboseManager->initialize(env)) {64verboseManager->kill(env);65verboseManager = NULL;66}67}68return verboseManager;69}7071/**72* Initializes the MM_VerboseManager instance.73*/74bool75MM_VerboseManagerJava::initialize(MM_EnvironmentBase *env)76{77PORT_ACCESS_FROM_ENVIRONMENT(env);78MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());79_mmHooks = J9_HOOK_INTERFACE(extensions->hookInterface);80_mmPrivateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);81_omrHooks = J9_HOOK_INTERFACE(extensions->omrHookInterface);8283_writerChain = MM_VerboseWriterChain::newInstance(env);84if (NULL == _writerChain) {85return false;86}8788if(NULL == (_verboseHandlerOutput = createVerboseHandlerOutputObject(env))) {89return false;90}9192_lastOutputTime = j9time_hires_clock();9394return true;95}9697MM_VerboseHandlerOutput *98MM_VerboseManagerJava::createVerboseHandlerOutputObject(MM_EnvironmentBase *env)99{100MM_VerboseHandlerOutput *handler = NULL;101MM_GCExtensionsBase *extensions = env->getExtensions();102103if (extensions->isMetronomeGC()) {104#if defined(J9VM_GC_REALTIME)105handler = MM_VerboseHandlerOutputRealtime::newInstance(env, this);106#endif /* defined(J9VM_GC_REALTIME) */107} else if (extensions->isVLHGC()) {108#if defined(J9VM_GC_VLHGC)109handler = MM_VerboseHandlerOutputVLHGC::newInstance(env, this);110#endif /* defined(J9VM_GC_VLHGC) */111} else if (extensions->isStandardGC()) {112#if defined(J9VM_GC_MODRON_STANDARD)113handler = MM_VerboseHandlerOutputStandardJava::newInstance(env, this);114#endif /* defined(J9VM_GC_MODRON_STANDARD) */115} else {116/* unknown collector type but verbose doesn't have assertions so just return NULL so that a caller will observe that we failed */117}118return handler;119}120121MM_VerboseWriter *122MM_VerboseManagerJava::createWriter(MM_EnvironmentBase *env, WriterType type, char *filename, UDATA fileCount, UDATA iterations)123{124MM_VerboseWriter *writer = NULL;125126switch(type) {127case VERBOSE_WRITER_STANDARD_STREAM:128writer = MM_VerboseWriterStreamOutput::newInstance(env, filename);129break;130131case VERBOSE_WRITER_TRACE:132writer = MM_VerboseWriterTrace::newInstance(env);133break;134135case VERBOSE_WRITER_HOOK:136writer = MM_VerboseWriterHook::newInstance(env);137break;138139case VERBOSE_WRITER_FILE_LOGGING_SYNCHRONOUS:140writer = MM_VerboseWriterFileLoggingSynchronous::newInstance(env, this, filename, fileCount, iterations);141if (NULL == writer) {142writer = findWriterInChain(VERBOSE_WRITER_STANDARD_STREAM);143if (NULL != writer) {144writer->isActive(true);145return writer;146}147/* if we failed to create a file stream and there is no stderr stream try to create a stderr stream */148writer = MM_VerboseWriterStreamOutput::newInstance(env, NULL);149}150break;151152case VERBOSE_WRITER_FILE_LOGGING_BUFFERED:153writer = MM_VerboseWriterFileLoggingBuffered::newInstance(env, this, filename, fileCount, iterations);154if (NULL == writer) {155writer = findWriterInChain(VERBOSE_WRITER_STANDARD_STREAM);156if (NULL != writer) {157writer->isActive(true);158return writer;159}160/* if we failed to create a file stream and there is no stderr stream try to create a stderr stream */161writer = MM_VerboseWriterStreamOutput::newInstance(env, NULL);162}163break;164165default:166return NULL;167}168169return writer;170}171172void173MM_VerboseManagerJava::handleFileOpenError(MM_EnvironmentBase *env, char *fileName)174{175OMRPORT_ACCESS_FROM_OMRPORT(env->getPortLibrary());176omrnls_printf(J9NLS_ERROR, J9NLS_GC_UNABLE_TO_OPEN_FILE, fileName);177}178179180181