--- old/src/hotspot/share/trace/traceMacros.hpp 2018-04-09 14:17:55.769816546 +0200 +++ new/src/hotspot/share/trace/traceMacros.hpp 2018-04-09 14:17:55.061772007 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,27 +25,159 @@ #ifndef SHARE_VM_TRACE_TRACEMACROS_HPP #define SHARE_VM_TRACE_TRACEMACROS_HPP +#include "utilities/macros.hpp" + typedef u8 traceid; +#if INCLUDE_TRACE + +#define JDK_JFR_EVENT_SUBKLASS 16 +#define JDK_JFR_EVENT_KLASS 32 +#define EVENT_HOST_KLASS 64 +#define IS_EVENT_KLASS(ptr) (((ptr)->trace_id() & (JDK_JFR_EVENT_KLASS | JDK_JFR_EVENT_SUBKLASS)) != 0) +#define IS_JDK_JFR_EVENT_SUBKLASS(ptr) (((ptr)->trace_id() & (JDK_JFR_EVENT_SUBKLASS)) != 0) + +#define USED_BIT 1 +#define METHOD_USED_BIT (USED_BIT << 2) +#define EPOCH_1_SHIFT 0 +#define EPOCH_2_SHIFT 1 +#define LEAKP_SHIFT 8 + +#define USED_EPOCH_1_BIT (USED_BIT << EPOCH_1_SHIFT) +#define USED_EPOCH_2_BIT (USED_BIT << EPOCH_2_SHIFT) +#define LEAKP_USED_EPOCH_1_BIT (USED_EPOCH_1_BIT << LEAKP_SHIFT) +#define LEAKP_USED_EPOCH_2_BIT (USED_EPOCH_2_BIT << LEAKP_SHIFT) +#define METHOD_USED_EPOCH_1_BIT (METHOD_USED_BIT << EPOCH_1_SHIFT) +#define METHOD_USED_EPOCH_2_BIT (METHOD_USED_BIT << EPOCH_2_SHIFT) +#define METHOD_AND_CLASS_IN_USE_BITS (METHOD_USED_BIT | USED_BIT) +#define METHOD_AND_CLASS_IN_USE_EPOCH_1_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_1_SHIFT) +#define METHOD_AND_CLASS_IN_USE_EPOCH_2_BITS (METHOD_AND_CLASS_IN_USE_BITS << EPOCH_2_SHIFT) + +#define ANY_USED_BITS (USED_EPOCH_2_BIT | \ + USED_EPOCH_1_BIT | \ + METHOD_USED_EPOCH_2_BIT | \ + METHOD_USED_EPOCH_1_BIT | \ + LEAKP_USED_EPOCH_2_BIT | \ + LEAKP_USED_EPOCH_1_BIT) + +#define TRACE_ID_META_BITS (EVENT_HOST_KLASS | JDK_JFR_EVENT_KLASS | JDK_JFR_EVENT_SUBKLASS | ANY_USED_BITS) +#define EVENT_THREAD_EXIT(thread) JfrBackend::on_javathread_exit(thread) +#define EVENT_THREAD_DESTRUCT(thread) JfrBackend::on_thread_destruct(thread) +#define TRACE_SUSPEND_THREAD(thread) JfrBackend::on_javathread_suspend(thread) +#define TRACE_INIT_ID(data) JfrTraceId::assign(data); +#define TRACE_REMOVE_ID(k) JfrTraceId::remove(k); +#define TRACE_RESTORE_ID(k) JfrTraceId::restore(k); +#define TRACE_KLASS_CREATION(k, p, t) if (IS_EVENT_KLASS(k)) JfrEventClassTransformer::on_klass_creation(k, p, t); +#define THREAD_TRACE_ID(thread) thread->trace_data()->thread_id() +#define TRACE_DEFINE_TRACE_ID_FIELD mutable traceid _trace_id + +#define TRACE_DEFINE_TRACE_ID_METHODS \ + traceid trace_id() const { return _trace_id; } \ + traceid* const trace_id_addr() const { return &_trace_id; } \ + void set_trace_id(traceid id) const { _trace_id = id; } + +class TraceFlag { + private: + mutable jbyte _flags; + public: + TraceFlag() : _flags(0) {} + explicit TraceFlag(jbyte flags) : _flags(flags) {} + void set_flag(jbyte flag) const { + _flags |= flag; + } + void clear_flag(jbyte flag) const { + _flags &= (~flag); + } + jbyte flags() const { return _flags; } + bool is_set(jbyte flag) const { + return (_flags & flag) != 0; + } + jbyte* const flags_addr() const{ + return &_flags; + } +}; + +#define TRACE_DEFINE_FLAG mutable TraceFlag _trace_flags +#define TRACE_DEFINE_FLAG_ACCESSOR \ + void set_trace_flag(jbyte flag) const { \ + _trace_flags.set_flag(flag); \ + } \ + jbyte trace_flags() const { \ + return _trace_flags.flags(); \ + } \ + bool is_trace_flag_set(jbyte flag) const { \ + return _trace_flags.is_set(flag); \ + } \ + jbyte* const trace_flags_addr() const { \ + return _trace_flags.flags_addr(); \ + } + +#define TRACE_FLUSH(E, thread) JfrEventConditionalFlush flush(thread); +#define TRACE_STACKTRACE_MARK(thread) JfrStackTraceMark mark(thread); +#define TRACE_FLUSH_WITH_STACKTRACE(E, thread) JfrEventConditionalFlushWithStacktrace flush(thread); + +#define TRACE_DATA JfrThreadData +#define TRACE_START() Jfr::on_vm_start() +#define TRACE_INITIALIZE() Jfr::on_vm_init() +#define TRACE_ALLOCATION(obj, size, thread) ObjectSampleAssistance osa(obj, size, thread); +#define TRACE_WEAK_OOPS_DO(is_alive, f) LeakProfiler::oops_do(is_alive, f) +#define TRACE_VM_EXIT() Jfr::on_vm_shutdown(); +#define TRACE_VM_ERROR() Jfr::on_vm_shutdown(true); +#define TRACE_DEFINE_KLASS_TRACE_ID_OFFSET \ + static ByteSize trace_id_offset() { return in_ByteSize(offset_of(InstanceKlass, _trace_id)); } +#define TRACE_KLASS_TRACE_ID_OFFSET InstanceKlass::trace_id_offset() +#define TRACE_DEFINE_THREAD_TRACE_DATA_OFFSET \ + static ByteSize trace_data_offset() { return in_ByteSize(offset_of(Thread, _trace_data)) ;} +#define TRACE_THREAD_TRACE_DATA_OFFSET Thread::trace_data_offset() +#define TRACE_DEFINE_THREAD_DATA_WRITER_OFFSET \ + static ByteSize java_event_writer_offset() { return in_ByteSize(offset_of(TRACE_DATA, _java_event_writer)); } +#define TRACE_THREAD_DATA_WRITER_OFFSET \ + TRACE_DATA::java_event_writer_offset() + TRACE_THREAD_TRACE_DATA_OFFSET +#define TRACE_DEFINE_THREAD_ID_OFFSET \ + static ByteSize trace_id_offset() { return in_ByteSize(offset_of(TRACE_DATA, _trace_id)); } +#define TRACE_DEFINE_THREAD_ID_SIZE \ + static size_t trace_id_size() { return sizeof(traceid); } +#define TRACE_THREAD_TRACE_ID_OFFSET TRACE_DATA::trace_id_offset() +#define TRACE_THREAD_TRACE_ID_SHIFT 8 +#define TRACE_THREAD_TRACE_ID_SIZE TRACE_DATA::trace_id_size() +#define TRACE_TIME_METHOD JfrTraceTime::time_function() +#define TRACE_TEMPLATES(template) \ + template(jdk_jfr_internal_JVM, "jdk/jfr/internal/JVM") + +#define TRACE_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias) \ + do_intrinsic(_counterTime, jdk_jfr_internal_JVM, counterTime_name, void_long_signature, F_SN) \ + do_name( counterTime_name, "counterTime") \ + do_intrinsic(_getClassId, jdk_jfr_internal_JVM, getClassId_name, class_long_signature, F_SN) \ + do_name( getClassId_name, "getClassId") \ + do_intrinsic(_getEventWriter, jdk_jfr_internal_JVM, getEventWriter_name, void_object_signature, F_SN) \ + do_name( getEventWriter_name, "getEventWriter") \ + +#define TRACE_HAVE_INTRINSICS + +extern "C" void JNICALL trace_register_natives(JNIEnv*, jclass); +#define TRACE_REGISTER_NATIVES ((void*)((address_word)(&trace_register_natives))) + +#else // !INCLUDE_TRACE + #define EVENT_THREAD_EXIT(thread) #define EVENT_THREAD_DESTRUCT(thread) #define TRACE_KLASS_CREATION(k, p, t) +#define TRACE_KLASS_DEFINITION(k, t) #define TRACE_INIT_ID(k) #define TRACE_REMOVE_ID(k) #define TRACE_RESTORE_ID(k) + #define TRACE_DATA TraceThreadData #define THREAD_TRACE_ID(thread) ((traceid)thread->osthread()->thread_id()) -extern "C" void JNICALL trace_register_natives(JNIEnv*, jclass); -#define TRACE_REGISTER_NATIVES ((void*)((address_word)(&trace_register_natives))) + #define TRACE_START() JNI_OK #define TRACE_INITIALIZE() JNI_OK #define TRACE_ALLOCATION(obj, size, thread) #define TRACE_WEAK_OOPS_DO(is_alive, f) #define TRACE_VM_EXIT() #define TRACE_VM_ERROR() -#define TRACE_SUSPEND_THREAD(t) #define TRACE_DEFINE_TRACE_ID_METHODS typedef int ___IGNORED_hs_trace_type1 #define TRACE_DEFINE_TRACE_ID_FIELD typedef int ___IGNORED_hs_trace_type2 @@ -55,6 +187,7 @@ #define TRACE_THREAD_TRACE_DATA_OFFSET in_ByteSize(0); ShouldNotReachHere() #define TRACE_DEFINE_THREAD_TRACE_ID_OFFSET typedef int ___IGNORED_hs_trace_type5 #define TRACE_THREAD_TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere() +#define TRACE_THREAD_TRACE_ID_SHIFT #define TRACE_DEFINE_THREAD_ID_SIZE typedef int ___IGNORED_hs_trace_type6 #define TRACE_DEFINE_THREAD_DATA_WRITER_OFFSET typedef int ___IGNORED_hs_trace_type7 #define TRACE_THREAD_DATA_WRITER_OFFSET in_ByteSize(0); ShouldNotReachHere() @@ -63,4 +196,5 @@ #define TRACE_TEMPLATES(template) #define TRACE_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias) +#endif // INCLUDE_TRACE #endif // SHARE_VM_TRACE_TRACEMACROS_HPP