Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/jfr/utilities/jfrJavaLog.cpp
38920 views
/*1* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "jfr/jni/jfrJavaSupport.hpp"26#include "jfr/utilities/jfrJavaLog.hpp"27#include "memory/resourceArea.hpp"28#include "runtime/thread.inline.hpp"2930// #define JFR_LOG_TAGS_CONCATED(T0, T1, T2, T3, T4, T5, ...) \31// T0 ## _ ## T1 ## _ ## T2 ## _ ## T3 ## _ ## T4 ## _ ## T53233// enum JfrLogTagSetType {34// #define JFR_LOG_TAG(...) \35// EXPAND_VARARGS(JFR_LOG_TAGS_CONCATED(__VA_ARGS__, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG)),3637// JFR_LOG_TAG_SET_LIST3839// #undef JFR_LOG_TAG40// JFR_LOG_TAG_SET_COUNT41// };4243// struct jfrLogSubscriber44// {45// jobject log_tag_enum_ref;46// LogTagSet* log_tag_set;47// };4849// static jfrLogSubscriber log_tag_sets[JFR_LOG_TAG_SET_COUNT];5051// static void log_cfg_update(LogLevelType llt, JfrLogTagSetType jflt, TRAPS) {52// DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));53// if (log_tag_sets[jflt].log_tag_enum_ref == NULL) {54// return;55// }56// jobject lt = log_tag_sets[jflt].log_tag_enum_ref;57// // set field tagSetLevel to llt value58// JavaValue result(T_VOID);59// JfrJavaArguments args(&result);60// args.set_klass(JfrJavaSupport::klass(lt));61// args.set_name("tagSetLevel", CHECK);62// args.set_signature("I", CHECK);63// args.set_receiver(JfrJavaSupport::resolve_non_null(lt));64// args.push_int(llt);65// JfrJavaSupport::set_field(&args, THREAD);66// }6768// static LogLevelType highest_level(const LogTagSet& lts) {69// for (size_t i = 0; i < LogLevel::Count; i++) {70// if (lts.is_level((LogLevelType)i)) {71// return (LogLevelType)i;72// }73// }74// return LogLevel::Off;75// }7677// static void log_config_change_internal(bool init, TRAPS) {78// LogLevelType llt;79// LogTagSet* lts;8081// #define JFR_LOG_TAG(...) \82// lts = &LogTagSetMapping<LOG_TAGS(__VA_ARGS__)>::tagset(); \83// if (init) { \84// JfrLogTagSetType tagSetType = \85// EXPAND_VARARGS(JFR_LOG_TAGS_CONCATED(__VA_ARGS__, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG)); \86// assert(NULL == log_tag_sets[tagSetType].log_tag_set, "Init JFR LogTagSets twice"); \87// log_tag_sets[tagSetType].log_tag_set = lts; \88// } \89// llt = highest_level(*lts); \90// log_cfg_update(llt, \91// EXPAND_VARARGS(JFR_LOG_TAGS_CONCATED(__VA_ARGS__, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG)), THREAD);92// JFR_LOG_TAG_SET_LIST93// #undef JFR_LOG_TAG94// }9596// static void log_config_change() {97// Thread* t = Thread::current();98// DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(t));99// log_config_change_internal(false, t);100// }101102void JfrJavaLog::subscribe_log_level(jobject log_tag, jint id, TRAPS) {103DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));104// static bool subscribed_updates = true;105// assert(id < JFR_LOG_TAG_SET_COUNT,106// "LogTag id, java and native not in synch, %d < %d", id, JFR_LOG_TAG_SET_COUNT);107// assert(NULL == log_tag_sets[id].log_tag_enum_ref, "Subscribing twice");108// log_tag_sets[id].log_tag_enum_ref = JfrJavaSupport::global_jni_handle(log_tag, THREAD);109// if (subscribed_updates) {110// LogConfiguration::register_update_listener(&log_config_change);111// log_config_change_internal(true, THREAD);112// subscribed_updates = false;113// } else {114// log_config_change_internal(false, THREAD);115// }116}117118void JfrJavaLog::log(jint tag_set, jint level, jstring message, TRAPS) {119DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));120if (!LogJFR) {121return;122}123if (message == NULL) {124return;125}126// if (level < (jint)LogLevel::First || level > (jint)LogLevel::Last) {127// JfrJavaSupport::throw_illegal_argument_exception("LogLevel passed is outside valid range", THREAD);128// return;129// }130// if (tag_set < 0 || tag_set >= (jint)JFR_LOG_TAG_SET_COUNT) {131// JfrJavaSupport::throw_illegal_argument_exception("LogTagSet id is outside valid range", THREAD);132// return;133// }134ResourceMark rm(THREAD);135const char* const s = JfrJavaSupport::c_str(message, CHECK);136assert(s != NULL, "invariant");137// assert(log_tag_sets[tag_set].log_tag_set != NULL, "LogTagSet is not init");138// log_tag_sets[tag_set].log_tag_set->log((LogLevelType)level, s);139tty->print_cr("JFR: %s", s);140}141142143