8143226: Minor updates to Event Based tracing

Reviewed-by: jbachorik, egahlin
This commit is contained in:
Markus Grönlund 2016-03-01 23:46:09 +01:00
parent 12d9b13eee
commit 0e44e963d2
34 changed files with 211 additions and 321 deletions

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \ TraceGeneratedNames += \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%) TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -100,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS) $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) $(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \ TraceGeneratedNames += \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif endif
@ -101,9 +96,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS) $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) $(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \ TraceGeneratedNames += \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%) TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -100,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS) $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) $(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -56,8 +56,7 @@ TraceGeneratedNames = \
ifeq ($(HAS_ALT_SRC), true) ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \ TraceGeneratedNames += \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp \ traceEventControl.hpp
traceProducer.cpp
endif endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%) TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -96,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS) $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) $(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE) $(GENERATE_CODE)

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -43,8 +43,7 @@ TraceGeneratedNames = \
!if EXISTS($(TraceAltSrcDir)) !if EXISTS($(TraceAltSrcDir))
TraceGeneratedNames = $(TraceGeneratedNames) \ TraceGeneratedNames = $(TraceGeneratedNames) \
traceRequestables.hpp \ traceRequestables.hpp \
traceEventControl.hpp \ traceEventControl.hpp
traceProducer.cpp
!endif !endif
@ -58,8 +57,7 @@ TraceGeneratedFiles = \
!if EXISTS($(TraceAltSrcDir)) !if EXISTS($(TraceAltSrcDir))
TraceGeneratedFiles = $(TraceGeneratedFiles) \ TraceGeneratedFiles = $(TraceGeneratedFiles) \
$(TraceOutDir)/traceRequestables.hpp \ $(TraceOutDir)/traceRequestables.hpp \
$(TraceOutDir)/traceEventControl.hpp \ $(TraceOutDir)/traceEventControl.hpp
$(TraceOutDir)/traceProducer.cpp
!endif !endif
XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen
@ -98,10 +96,6 @@ $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)
@echo Generating AltSrc $@ @echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp @$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
@echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceProducer.xsl -OUT $(TraceOutDir)/traceProducer.cpp
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) $(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
@echo Generating AltSrc $@ @echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp @$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp

View file

@ -228,8 +228,6 @@ bool Compiler::is_intrinsic_supported(const methodHandle& method) {
case vmIntrinsics::_getCharStringU: case vmIntrinsics::_getCharStringU:
case vmIntrinsics::_putCharStringU: case vmIntrinsics::_putCharStringU:
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime: case vmIntrinsics::_counterTime:
#endif #endif
break; break;

View file

@ -43,6 +43,9 @@
#if INCLUDE_ALL_GCS #if INCLUDE_ALL_GCS
#include "gc/g1/heapRegion.hpp" #include "gc/g1/heapRegion.hpp"
#endif // INCLUDE_ALL_GCS #endif // INCLUDE_ALL_GCS
#ifdef TRACE_HAVE_INTRINSICS
#include "trace/traceMacros.hpp"
#endif
#ifdef ASSERT #ifdef ASSERT
#define __ gen()->lir(__FILE__, __LINE__)-> #define __ gen()->lir(__FILE__, __LINE__)->
@ -3067,42 +3070,7 @@ void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
__ move(reg, result); __ move(reg, result);
} }
#ifdef TRACE_HAVE_INTRINSICS
void LIRGenerator::do_ThreadIDIntrinsic(Intrinsic* x) {
LIR_Opr thread = getThreadPointer();
LIR_Opr osthread = new_pointer_register();
__ move(new LIR_Address(thread, in_bytes(JavaThread::osthread_offset()), osthread->type()), osthread);
size_t thread_id_size = OSThread::thread_id_size();
if (thread_id_size == (size_t) BytesPerLong) {
LIR_Opr id = new_register(T_LONG);
__ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_LONG), id);
__ convert(Bytecodes::_l2i, id, rlock_result(x));
} else if (thread_id_size == (size_t) BytesPerInt) {
__ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_INT), rlock_result(x));
} else {
ShouldNotReachHere();
}
}
void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) {
CodeEmitInfo* info = state_for(x);
CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check
BasicType klass_pointer_type = NOT_LP64(T_INT) LP64_ONLY(T_LONG);
assert(info != NULL, "must have info");
LIRItem arg(x->argument_at(1), this);
arg.load_item();
LIR_Opr klass = new_pointer_register();
__ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), klass_pointer_type), klass, info);
LIR_Opr id = new_register(T_LONG);
ByteSize offset = TRACE_ID_OFFSET;
LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
__ move(trace_id_addr, id);
__ logical_or(id, LIR_OprFact::longConst(0x01l), id);
__ store(id, trace_id_addr);
__ logical_and(id, LIR_OprFact::longConst(~0x3l), id);
__ move(id, rlock_result(x));
}
#endif
void LIRGenerator::do_Intrinsic(Intrinsic* x) { void LIRGenerator::do_Intrinsic(Intrinsic* x) {
switch (x->id()) { switch (x->id()) {
@ -3115,8 +3083,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
} }
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break;
case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break;
case vmIntrinsics::_counterTime: case vmIntrinsics::_counterTime:
do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x); do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
break; break;

View file

@ -440,10 +440,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux); void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
void do_RuntimeCall(address routine, Intrinsic* x); void do_RuntimeCall(address routine, Intrinsic* x);
#ifdef TRACE_HAVE_INTRINSICS
void do_ThreadIDIntrinsic(Intrinsic* x);
void do_ClassIDIntrinsic(Intrinsic* x);
#endif
ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k, ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k,
Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k, Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k,
ciKlass* callee_signature_k); ciKlass* callee_signature_k);

View file

@ -5380,7 +5380,7 @@ void ClassFileParser::fill_instance_klass(InstanceKlass* ik, TRAPS) {
} }
} }
TRACE_INIT_ID(ik); TRACE_INIT_KLASS_ID(ik);
// If we reach here, all is well. // If we reach here, all is well.
// Now remove the InstanceKlass* from the _klass_to_deallocate field // Now remove the InstanceKlass* from the _klass_to_deallocate field

View file

@ -328,8 +328,6 @@ bool vmIntrinsics::preserves_state(vmIntrinsics::ID id) {
assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
switch(id) { switch(id) {
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime: case vmIntrinsics::_counterTime:
#endif #endif
case vmIntrinsics::_currentTimeMillis: case vmIntrinsics::_currentTimeMillis:

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
#define SHARE_VM_GC_SHARED_COPYFAILEDINFO_HPP #define SHARE_VM_GC_SHARED_COPYFAILEDINFO_HPP
#include "runtime/thread.hpp" #include "runtime/thread.hpp"
#include "trace/traceMacros.hpp"
#include "utilities/globalDefinitions.hpp" #include "utilities/globalDefinitions.hpp"
class CopyFailedInfo : public CHeapObj<mtGC> { class CopyFailedInfo : public CHeapObj<mtGC> {
@ -63,26 +64,28 @@ class CopyFailedInfo : public CHeapObj<mtGC> {
}; };
class PromotionFailedInfo : public CopyFailedInfo { class PromotionFailedInfo : public CopyFailedInfo {
OSThread* _thread; traceid _thread_trace_id;
public: public:
PromotionFailedInfo() : CopyFailedInfo(), _thread(NULL) {} PromotionFailedInfo() : CopyFailedInfo(), _thread_trace_id(0) {}
void register_copy_failure(size_t size) { void register_copy_failure(size_t size) {
CopyFailedInfo::register_copy_failure(size); CopyFailedInfo::register_copy_failure(size);
if (_thread == NULL) { if (_thread_trace_id == 0) {
_thread = Thread::current()->osthread(); _thread_trace_id = THREAD_TRACE_ID(Thread::current());
} else { } else {
assert(_thread == Thread::current()->osthread(), "The PromotionFailedInfo should be thread local."); assert(THREAD_TRACE_ID(Thread::current()) == _thread_trace_id,
"The PromotionFailedInfo should be thread local.");
} }
} }
void reset() { void reset() {
CopyFailedInfo::reset(); CopyFailedInfo::reset();
_thread = NULL; _thread_trace_id = 0;
} }
OSThread* thread() const { return _thread; } traceid thread_trace_id() const { return _thread_trace_id; }
}; };
class EvacuationFailedInfo : public CopyFailedInfo {}; class EvacuationFailedInfo : public CopyFailedInfo {};

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -174,7 +174,7 @@ void YoungGCTracer::send_promotion_failed_event(const PromotionFailedInfo& pf_in
if (e.should_commit()) { if (e.should_commit()) {
e.set_gcId(GCId::current()); e.set_gcId(GCId::current());
e.set_data(to_trace_struct(pf_info)); e.set_data(to_trace_struct(pf_info));
e.set_thread(pf_info.thread()->thread_id()); e.set_thread(pf_info.thread_trace_id());
e.commit(); e.commit();
} }
} }

View file

@ -89,7 +89,7 @@ ArrayKlass::ArrayKlass(Symbol* name) :
set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass()); set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
set_layout_helper(Klass::_lh_neutral_value); set_layout_helper(Klass::_lh_neutral_value);
set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
TRACE_INIT_ID(this); TRACE_INIT_KLASS_ID(this);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -839,7 +839,7 @@ public:
// support for stub routines // support for stub routines
static ByteSize init_state_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_state)); } static ByteSize init_state_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_state)); }
TRACE_DEFINE_OFFSET; TRACE_DEFINE_KLASS_TRACE_ID_OFFSET;
static ByteSize init_thread_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_thread)); } static ByteSize init_thread_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_thread)); }
// subclass/subinterface checks // subclass/subinterface checks

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -494,7 +494,7 @@ void Klass::remove_unshareable_info() {
} }
void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) { void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
TRACE_INIT_ID(this); TRACE_INIT_KLASS_ID(this);
// If an exception happened during CDS restore, some of these fields may already be // If an exception happened during CDS restore, some of these fields may already be
// set. We leave the class on the CLD list, even if incomplete so that we don't // set. We leave the class on the CLD list, even if incomplete so that we don't
// modify the CLD list outside a safepoint. // modify the CLD list outside a safepoint.

View file

@ -132,7 +132,7 @@ class Klass : public Metadata {
jint _modifier_flags; // Processed access flags, for use by Class.getModifiers. jint _modifier_flags; // Processed access flags, for use by Class.getModifiers.
AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here. AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here.
TRACE_DEFINE_KLASS_TRACE_ID; TRACE_DEFINE_TRACE_ID_FIELD;
// Biased locking implementation and statistics // Biased locking implementation and statistics
// (the 64-bit chunk goes first, to avoid some fragmentation) // (the 64-bit chunk goes first, to avoid some fragmentation)
@ -569,7 +569,7 @@ protected:
jlong last_biased_lock_bulk_revocation_time() { return _last_biased_lock_bulk_revocation_time; } jlong last_biased_lock_bulk_revocation_time() { return _last_biased_lock_bulk_revocation_time; }
void set_last_biased_lock_bulk_revocation_time(jlong cur_time) { _last_biased_lock_bulk_revocation_time = cur_time; } void set_last_biased_lock_bulk_revocation_time(jlong cur_time) { _last_biased_lock_bulk_revocation_time = cur_time; }
TRACE_DEFINE_KLASS_METHODS; TRACE_DEFINE_TRACE_ID_METHODS;
// garbage collection support // garbage collection support
void oops_do(OopClosure* cl); void oops_do(OopClosure* cl);

View file

@ -400,8 +400,6 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
case vmIntrinsics::_currentThread: case vmIntrinsics::_currentThread:
case vmIntrinsics::_isInterrupted: case vmIntrinsics::_isInterrupted:
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime: case vmIntrinsics::_counterTime:
#endif #endif
case vmIntrinsics::_currentTimeMillis: case vmIntrinsics::_currentTimeMillis:

View file

@ -49,7 +49,9 @@
#include "opto/subnode.hpp" #include "opto/subnode.hpp"
#include "prims/nativeLookup.hpp" #include "prims/nativeLookup.hpp"
#include "runtime/sharedRuntime.hpp" #include "runtime/sharedRuntime.hpp"
#ifdef TRACE_HAVE_INTRINSICS
#include "trace/traceMacros.hpp" #include "trace/traceMacros.hpp"
#endif
class LibraryIntrinsic : public InlineCallGenerator { class LibraryIntrinsic : public InlineCallGenerator {
// Extend the set of intrinsics known to the runtime: // Extend the set of intrinsics known to the runtime:
@ -246,10 +248,7 @@ class LibraryCallKit : public GraphKit {
bool inline_unsafe_allocate(); bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory(); bool inline_unsafe_copyMemory();
bool inline_native_currentThread(); bool inline_native_currentThread();
#ifdef TRACE_HAVE_INTRINSICS
bool inline_native_classID();
bool inline_native_threadID();
#endif
bool inline_native_time_funcs(address method, const char* funcName); bool inline_native_time_funcs(address method, const char* funcName);
bool inline_native_isInterrupted(); bool inline_native_isInterrupted();
bool inline_native_Class_query(vmIntrinsics::ID id); bool inline_native_Class_query(vmIntrinsics::ID id);
@ -642,8 +641,6 @@ bool LibraryCallKit::try_to_inline(int predicate) {
case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted(); case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted();
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID: return inline_native_classID();
case vmIntrinsics::_threadID: return inline_native_threadID();
case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime"); case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime");
#endif #endif
case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis"); case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis");
@ -2932,52 +2929,6 @@ bool LibraryCallKit::inline_unsafe_allocate() {
return true; return true;
} }
#ifdef TRACE_HAVE_INTRINSICS
/*
* oop -> myklass
* myklass->trace_id |= USED
* return myklass->trace_id & ~0x3
*/
bool LibraryCallKit::inline_native_classID() {
null_check_receiver(); // null-check, then ignore
Node* cls = null_check(argument(1), T_OBJECT);
Node* kls = load_klass_from_mirror(cls, false, NULL, 0);
kls = null_check(kls, T_OBJECT);
ByteSize offset = TRACE_ID_OFFSET;
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
Node* bits = longcon(~0x03l); // ignore bit 0 & 1
Node* andl = _gvn.transform(new AndLNode(tvalue, bits));
Node* clsused = longcon(0x01l); // set the class bit
Node* orl = _gvn.transform(new OrLNode(tvalue, clsused));
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
set_result(andl);
return true;
}
bool LibraryCallKit::inline_native_threadID() {
Node* tls_ptr = NULL;
Node* cur_thr = generate_current_thread(tls_ptr);
Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset()));
Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS, MemNode::unordered);
p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::thread_id_offset()));
Node* threadid = NULL;
size_t thread_id_size = OSThread::thread_id_size();
if (thread_id_size == (size_t) BytesPerLong) {
threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG, MemNode::unordered));
} else if (thread_id_size == (size_t) BytesPerInt) {
threadid = make_load(control(), p, TypeInt::INT, T_INT, MemNode::unordered);
} else {
ShouldNotReachHere();
}
set_result(threadid);
return true;
}
#endif
//------------------------inline_native_time_funcs-------------- //------------------------inline_native_time_funcs--------------
// inline code for System.currentTimeMillis() and System.nanoTime() // inline code for System.currentTimeMillis() and System.nanoTime()
// these have the same type and signature // these have the same type and signature

View file

@ -73,6 +73,7 @@
#include "runtime/vm_operations.hpp" #include "runtime/vm_operations.hpp"
#include "services/memTracker.hpp" #include "services/memTracker.hpp"
#include "services/runtimeService.hpp" #include "services/runtimeService.hpp"
#include "trace/traceMacros.hpp"
#include "trace/tracing.hpp" #include "trace/tracing.hpp"
#include "utilities/defaultStream.hpp" #include "utilities/defaultStream.hpp"
#include "utilities/dtrace.hpp" #include "utilities/dtrace.hpp"
@ -3929,7 +3930,7 @@ static jint JNI_CreateJavaVM_inner(JavaVM **vm, void **penv, void *args) {
EventThreadStart event; EventThreadStart event;
if (event.should_commit()) { if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj())); event.set_thread(THREAD_TRACE_ID(thread));
event.commit(); event.commit();
} }
@ -4149,7 +4150,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
EventThreadStart event; EventThreadStart event;
if (event.should_commit()) { if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj())); event.set_thread(THREAD_TRACE_ID(thread));
event.commit(); event.commit();
} }

View file

@ -64,6 +64,7 @@
#include "runtime/timer.hpp" #include "runtime/timer.hpp"
#include "runtime/vm_operations.hpp" #include "runtime/vm_operations.hpp"
#include "services/memTracker.hpp" #include "services/memTracker.hpp"
#include "trace/traceMacros.hpp"
#include "trace/tracing.hpp" #include "trace/tracing.hpp"
#include "utilities/dtrace.hpp" #include "utilities/dtrace.hpp"
#include "utilities/globalDefinitions.hpp" #include "utilities/globalDefinitions.hpp"
@ -485,7 +486,7 @@ void before_exit(JavaThread* thread) {
EventThreadEnd event; EventThreadEnd event;
if (event.should_commit()) { if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj())); event.set_thread(THREAD_TRACE_ID(thread));
event.commit(); event.commit();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -401,7 +401,7 @@ void NOINLINE ObjectMonitor::enter(TRAPS) {
if (event.should_commit()) { if (event.should_commit()) {
event.set_klass(((oop)this->object())->klass()); event.set_klass(((oop)this->object())->klass());
event.set_previousOwner((TYPE_JAVALANGTHREAD)_previous_owner_tid); event.set_previousOwner((TYPE_THREAD)_previous_owner_tid);
event.set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr())); event.set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
event.commit(); event.commit();
} }
@ -937,7 +937,7 @@ void NOINLINE ObjectMonitor::exit(bool not_suspended, TRAPS) {
// get the owner's thread id for the MonitorEnter event // get the owner's thread id for the MonitorEnter event
// if it is enabled and the thread isn't suspended // if it is enabled and the thread isn't suspended
if (not_suspended && Tracing::is_event_enabled(TraceJavaMonitorEnterEvent)) { if (not_suspended && Tracing::is_event_enabled(TraceJavaMonitorEnterEvent)) {
_previous_owner_tid = SharedRuntime::get_java_tid(Self); _previous_owner_tid = THREAD_TRACE_ID(Self);
} }
#endif #endif
@ -1391,11 +1391,12 @@ void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
jlong notifier_tid, jlong notifier_tid,
jlong timeout, jlong timeout,
bool timedout) { bool timedout) {
assert(event != NULL, "invariant");
event->set_klass(((oop)this->object())->klass()); event->set_klass(((oop)this->object())->klass());
event->set_timeout((TYPE_ULONG)timeout); event->set_timeout(timeout);
event->set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr())); event->set_address((TYPE_ADDRESS)this->object_addr());
event->set_notifier((TYPE_OSTHREAD)notifier_tid); event->set_notifier(notifier_tid);
event->set_timedOut((TYPE_BOOLEAN)timedout); event->set_timedOut(timedout);
event->commit(); event->commit();
} }
@ -1655,7 +1656,7 @@ void ObjectMonitor::INotify(Thread * Self) {
iterator->TState = ObjectWaiter::TS_ENTER; iterator->TState = ObjectWaiter::TS_ENTER;
} }
iterator->_notified = 1; iterator->_notified = 1;
iterator->_notifier_tid = Self->osthread()->thread_id(); iterator->_notifier_tid = THREAD_TRACE_ID(Self);
ObjectWaiter * list = _EntryList; ObjectWaiter * list = _EntryList;
if (list != NULL) { if (list != NULL) {

View file

@ -1694,7 +1694,7 @@ void JavaThread::run() {
EventThreadStart event; EventThreadStart event;
if (event.should_commit()) { if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj())); event.set_thread(THREAD_TRACE_ID(this));
event.commit(); event.commit();
} }
@ -1799,7 +1799,7 @@ void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
// from java_lang_Thread object // from java_lang_Thread object
EventThreadEnd event; EventThreadEnd event;
if (event.should_commit()) { if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj())); event.set_thread(THREAD_TRACE_ID(this));
event.commit(); event.commit();
} }
@ -3554,6 +3554,10 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
return status; return status;
} }
if (TRACE_INITIALIZE() != JNI_OK) {
vm_exit_during_initialization("Failed to initialize tracing backend");
}
// Should be done after the heap is fully created // Should be done after the heap is fully created
main_thread->cache_global_variables(); main_thread->cache_global_variables();
@ -3622,11 +3626,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
quicken_jni_functions(); quicken_jni_functions();
// Must be run after init_ft which initializes ft_enabled
if (TRACE_INITIALIZE() != JNI_OK) {
vm_exit_during_initialization("Failed to initialize tracing backend");
}
// No more stub generation allowed after that point. // No more stub generation allowed after that point.
StubCodeDesc::freeze(); StubCodeDesc::freeze();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -448,7 +448,8 @@ class Thread: public ThreadShadow {
void incr_allocated_bytes(jlong size) { _allocated_bytes += size; } void incr_allocated_bytes(jlong size) { _allocated_bytes += size; }
inline jlong cooked_allocated_bytes(); inline jlong cooked_allocated_bytes();
TRACE_DATA* trace_data() { return &_trace_data; } TRACE_DEFINE_THREAD_TRACE_DATA_OFFSET;
TRACE_DATA* trace_data() const { return &_trace_data; }
const ThreadExt& ext() const { return _ext; } const ThreadExt& ext() const { return _ext; }
ThreadExt& ext() { return _ext; } ThreadExt& ext() { return _ext; }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -359,7 +359,7 @@ void VMThread::evaluate_operation(VM_Operation* op) {
// Only write caller thread information for non-concurrent vm operations. // Only write caller thread information for non-concurrent vm operations.
// For concurrent vm operations, the thread id is set to 0 indicating thread is unknown. // For concurrent vm operations, the thread id is set to 0 indicating thread is unknown.
// This is because the caller thread could have exited already. // This is because the caller thread could have exited already.
event.set_caller(is_concurrent ? 0 : op->calling_thread()->osthread()->thread_id()); event.set_caller(is_concurrent ? 0 : THREAD_TRACE_ID(op->calling_thread()));
event.commit(); event.commit();
} }

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
@ -73,12 +73,12 @@ Declares a structure type that can be used in other events.
<events> <events>
<event id="ThreadStart" path="java/thread_start" label="Java Thread Start" <event id="ThreadStart" path="java/thread_start" label="Java Thread Start"
has_thread="true" is_instant="true"> has_thread="true" is_instant="true">
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/> <value type="THREAD" field="thread" label="Java Thread"/>
</event> </event>
<event id="ThreadEnd" path="java/thread_end" label="Java Thread End" <event id="ThreadEnd" path="java/thread_end" label="Java Thread End"
has_thread="true" is_instant="true"> has_thread="true" is_instant="true">
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/> <value type="THREAD" field="thread" label="Java Thread"/>
</event> </event>
<event id="ThreadSleep" path="java/thread_sleep" label="Java Thread Sleep" <event id="ThreadSleep" path="java/thread_sleep" label="Java Thread Sleep"
@ -96,14 +96,14 @@ Declares a structure type that can be used in other events.
<event id="JavaMonitorEnter" path="java/monitor_enter" label="Java Monitor Blocked" <event id="JavaMonitorEnter" path="java/monitor_enter" label="Java Monitor Blocked"
has_thread="true" has_stacktrace="true" is_instant="false"> has_thread="true" has_stacktrace="true" is_instant="false">
<value type="CLASS" field="klass" label="Monitor Class"/> <value type="CLASS" field="klass" label="Monitor Class"/>
<value type="JAVALANGTHREAD" field="previousOwner" label="Previous Monitor Owner"/> <value type="THREAD" field="previousOwner" label="Previous Monitor Owner"/>
<value type="ADDRESS" field="address" label="Monitor Address" relation="JAVA_MONITOR_ADDRESS"/> <value type="ADDRESS" field="address" label="Monitor Address" relation="JAVA_MONITOR_ADDRESS"/>
</event> </event>
<event id="JavaMonitorWait" path="java/monitor_wait" label="Java Monitor Wait" description="Waiting on a Java monitor" <event id="JavaMonitorWait" path="java/monitor_wait" label="Java Monitor Wait" description="Waiting on a Java monitor"
has_thread="true" has_stacktrace="true" is_instant="false"> has_thread="true" has_stacktrace="true" is_instant="false">
<value type="CLASS" field="klass" label="Monitor Class" description="Class of object waited on"/> <value type="CLASS" field="klass" label="Monitor Class" description="Class of object waited on"/>
<value type="OSTHREAD" field="notifier" label="Notifier Thread" description="Notifying Thread"/> <value type="THREAD" field="notifier" label="Notifier Thread" description="Notifying Thread"/>
<value type="MILLIS" field="timeout" label="Timeout" description="Maximum wait time"/> <value type="MILLIS" field="timeout" label="Timeout" description="Maximum wait time"/>
<value type="BOOLEAN" field="timedOut" label="Timed Out" description="Wait has been timed out"/> <value type="BOOLEAN" field="timedOut" label="Timed Out" description="Wait has been timed out"/>
<value type="ADDRESS" field="address" label="Monitor Address" description="Address of object waited on" relation="JAVA_MONITOR_ADDRESS"/> <value type="ADDRESS" field="address" label="Monitor Address" description="Address of object waited on" relation="JAVA_MONITOR_ADDRESS"/>
@ -434,7 +434,7 @@ Declares a structure type that can be used in other events.
description="Promotion of an object failed"> description="Promotion of an object failed">
<value type="UINT" field="gcId" label="GC ID" relation="GC_ID"/> <value type="UINT" field="gcId" label="GC ID" relation="GC_ID"/>
<structvalue type="CopyFailed" field="data" label="Data"/> <structvalue type="CopyFailed" field="data" label="Data"/>
<value type="OSTHREAD" field="thread" label="Running thread"/> <value type="THREAD" field="thread" label="Running thread"/>
</event> </event>
<event id="EvacuationFailed" path="vm/gc/detailed/evacuation_failed" label="Evacuation Failed" is_instant="true" <event id="EvacuationFailed" path="vm/gc/detailed/evacuation_failed" label="Evacuation Failed" is_instant="true"
@ -496,6 +496,11 @@ Declares a structure type that can be used in other events.
<value type="UINT" field="allocContext" label="Allocation Context" /> <value type="UINT" field="allocContext" label="Allocation Context" />
</event> </event>
<event id="VMError" path="vm/runtime/vm_error" label="VM Error"
description="VM shutdown due to an error" has_stacktrace="true" has_thread="true">
<value type="BOOLEAN" field="out_of_java_memory" label="Java Out Of Memory"/>
</event>
<!-- Compiler events --> <!-- Compiler events -->
<event id="Compilation" path="vm/compiler/compilation" label="Compilation" <event id="Compilation" path="vm/compiler/compilation" label="Compilation"
@ -569,7 +574,7 @@ Declares a structure type that can be used in other events.
<value type="VMOPERATIONTYPE" field="operation" label="Operation" /> <value type="VMOPERATIONTYPE" field="operation" label="Operation" />
<value type="BOOLEAN" field="safepoint" label="At Safepoint" description="If the operation occured at a safepoint."/> <value type="BOOLEAN" field="safepoint" label="At Safepoint" description="If the operation occured at a safepoint."/>
<value type="BOOLEAN" field="blocking" label="Caller Blocked" description="If the calling thread was blocked until the operation was complete."/> <value type="BOOLEAN" field="blocking" label="Caller Blocked" description="If the calling thread was blocked until the operation was complete."/>
<value type="OSTHREAD" field="caller" label="Caller" transition="FROM" description="Thread requesting operation. If non-blocking, will be set to 0 indicating thread is unknown."/> <value type="THREAD" field="caller" label="Caller" transition="FROM" description="Thread requesting operation. If non-blocking, will be set to 0 indicating thread is unknown."/>
</event> </event>
<!-- Allocation events --> <!-- Allocation events -->

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -47,6 +47,10 @@ public:
static void on_unloading_classes(void) { static void on_unloading_classes(void) {
} }
static void on_vm_error(bool) {
}
}; };
class TraceThreadData { class TraceThreadData {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -31,39 +31,32 @@
enum { enum {
CONTENT_TYPE_NONE = 0, CONTENT_TYPE_NONE = 0,
CONTENT_TYPE_BYTES = 1, CONTENT_TYPE_CLASS = 20,
CONTENT_TYPE_EPOCHMILLIS = 2, CONTENT_TYPE_UTF8 = 21,
CONTENT_TYPE_MILLIS = 3, CONTENT_TYPE_THREAD = 22,
CONTENT_TYPE_NANOS = 4, CONTENT_TYPE_STACKTRACE = 23,
CONTENT_TYPE_TICKS = 5, CONTENT_TYPE_BYTES = 24,
CONTENT_TYPE_ADDRESS = 6, CONTENT_TYPE_EPOCHMILLIS = 25,
CONTENT_TYPE_MILLIS = 26,
CONTENT_TYPE_NANOS = 27,
CONTENT_TYPE_TICKS = 28,
CONTENT_TYPE_ADDRESS = 29,
CONTENT_TYPE_PERCENTAGE = 30,
CONTENT_TYPE_OSTHREAD, JVM_CONTENT_TYPES_START = 33,
CONTENT_TYPE_JAVALANGTHREAD, JVM_CONTENT_TYPES_END = 255
CONTENT_TYPE_STACKTRACE,
CONTENT_TYPE_CLASS,
CONTENT_TYPE_PERCENTAGE,
JVM_CONTENT_TYPES_START = 30,
JVM_CONTENT_TYPES_END = 100
}; };
enum ReservedEvent { enum ReservedEvent {
EVENT_PRODUCERS, EVENT_METADATA,
EVENT_CHECKPOINT, EVENT_CHECKPOINT,
EVENT_BUFFERLOST, EVENT_BUFFERLOST,
NUM_RESERVED_EVENTS NUM_RESERVED_EVENTS = JVM_CONTENT_TYPES_END
}; };
typedef enum ReservedEvent ReservedEvent; typedef enum ReservedEvent ReservedEvent;
typedef u8 classid; class Symbol;
typedef u8 stacktraceid;
typedef u8 methodid;
typedef u8 fieldid;
class TraceUnicodeString;
#endif // SHARE_VM_TRACE_TRACEDATATYPES_HPP #endif // SHARE_VM_TRACE_TRACEDATATYPES_HPP

View file

@ -99,9 +99,14 @@ class TraceEvent : public StackObj {
cancel(); cancel();
return; return;
} }
if (_startTime == 0) {
static_cast<T*>(this)->set_starttime(Tracing::time());
} else {
if (_endTime == 0) { if (_endTime == 0) {
static_cast<T*>(this)->set_endtime(Tracing::time()); static_cast<T*>(this)->set_endtime(Tracing::time());
} }
}
if (static_cast<T*>(this)->should_write()) { if (static_cast<T*>(this)->should_write()) {
static_cast<T*>(this)->writeEvent(); static_cast<T*>(this)->writeEvent();
} }

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
@ -52,8 +52,8 @@
class TraceEvent { class TraceEvent {
public: public:
TraceEvent() {} TraceEvent() {}
void set_starttime(const Ticks&amp; time) {} void set_starttime(const Ticks&amp; ignore) {}
void set_endtime(const Ticks&amp; time) {} void set_endtime(const Ticks&amp; ignore) {}
bool should_commit() const { return false; } bool should_commit() const { return false; }
static bool is_enabled() { return false; } static bool is_enabled() { return false; }
void commit() {} void commit() {}

View file

@ -43,7 +43,7 @@ enum TraceEventId {
_traceeventbase = (NUM_RESERVED_EVENTS-1), // Make sure we start at right index. _traceeventbase = (NUM_RESERVED_EVENTS-1), // Make sure we start at right index.
// Events -> enum entry // Events -> enum entry
<xsl:for-each select="trace/events/event"> <xsl:for-each select="trace/events/*">
<xsl:value-of select="concat(' Trace', @id, 'Event,', $newline)"/> <xsl:value-of select="concat(' Trace', @id, 'Event,', $newline)"/>
</xsl:for-each> </xsl:for-each>
MaxTraceEventId MaxTraceEventId

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,19 +25,28 @@
#ifndef SHARE_VM_TRACE_TRACEMACROS_HPP #ifndef SHARE_VM_TRACE_TRACEMACROS_HPP
#define SHARE_VM_TRACE_TRACEMACROS_HPP #define SHARE_VM_TRACE_TRACEMACROS_HPP
typedef u8 traceid;
#define EVENT_THREAD_EXIT(thread) #define EVENT_THREAD_EXIT(thread)
#define EVENT_THREAD_DESTRUCT(thread) #define EVENT_THREAD_DESTRUCT(thread)
#define TRACE_INIT_ID(k) #define TRACE_INIT_KLASS_ID(k)
#define TRACE_INIT_THREAD_ID(td)
#define TRACE_DATA TraceThreadData #define TRACE_DATA TraceThreadData
#define THREAD_TRACE_ID(thread) ((traceid)thread->osthread()->thread_id())
#define TRACE_START() JNI_OK #define TRACE_START() JNI_OK
#define TRACE_INITIALIZE() JNI_OK #define TRACE_INITIALIZE() JNI_OK
#define TRACE_DEFINE_KLASS_METHODS typedef int ___IGNORED_hs_trace_type1 #define TRACE_DEFINE_TRACE_ID_METHODS typedef int ___IGNORED_hs_trace_type1
#define TRACE_DEFINE_KLASS_TRACE_ID typedef int ___IGNORED_hs_trace_type2 #define TRACE_DEFINE_TRACE_ID_FIELD typedef int ___IGNORED_hs_trace_type2
#define TRACE_DEFINE_OFFSET typedef int ___IGNORED_hs_trace_type3 #define TRACE_DEFINE_KLASS_TRACE_ID_OFFSET typedef int ___IGNORED_hs_trace_type3
#define TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere() #define TRACE_KLASS_TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere()
#define TRACE_DEFINE_THREAD_TRACE_DATA_OFFSET typedef int ___IGNORED_hs_trace_type4
#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_DEFINE_THREAD_ID_SIZE typedef int ___IGNORED_hs_trace_type6
#define TRACE_TEMPLATES(template) #define TRACE_TEMPLATES(template)
#define TRACE_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias) #define TRACE_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias)

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
@ -60,27 +60,16 @@ Now we can use the content + data type in declaring event fields.
<types> <types>
<content_types> <content_types>
<content_type id="Thread" hr_name="Thread" <content_type id="Thread" hr_name="Thread"
type="U4" builtin_type="OSTHREAD"> type="U8" builtin_type="THREAD">
<value type="UTF8" field="name" label="Thread name"/> <value type="UTF8" field="osName" label="OS Thread Name"/>
</content_type> <value type="LONG" field="osThreadID" label="OS Thread ID"/>
<value type="UTF8" field="javaName" label="Java Lang Thread Name"/>
<content_type id="VMThread" hr_name="VM Thread" <value type="LONG" field="javaThreadID" label="Java Lang Thread ID"/>
type="U8" jvm_type="VMTHREAD">
<value type="OSTHREAD" field="thread" label="VM Thread"/>
</content_type>
<content_type id="JavaThread" hr_name="Java thread"
type="U8" builtin_type="JAVALANGTHREAD">
<value type="OSTHREAD" field="thread" label="OS Thread ID"/>
<value type="BYTES64" field="allocInsideTla"
label="Allocated bytes inside TLAs"/>
<value type="BYTES64" field="allocOutsideTla"
label="Allocated bytes outside TLAs"/>
<value type="THREADGROUP" field="group" label="Java Thread Group"/> <value type="THREADGROUP" field="group" label="Java Thread Group"/>
</content_type> </content_type>
<content_type id="ThreadGroup" hr_name="Thread group" <content_type id="ThreadGroup" hr_name="Thread group"
type="U4" jvm_type="THREADGROUP"> type="U8" jvm_type="THREADGROUP">
<value type="THREADGROUP" field="parent" label="Parent"/> <value type="THREADGROUP" field="parent" label="Parent"/>
<value type="UTF8" field="name" label="Name"/> <value type="UTF8" field="name" label="Name"/>
</content_type> </content_type>
@ -107,82 +96,82 @@ Now we can use the content + data type in declaring event fields.
</content_type> </content_type>
<content_type id="ThreadState" hr_name="Java Thread State" <content_type id="ThreadState" hr_name="Java Thread State"
type="U2" jvm_type="THREADSTATE"> type="U8" jvm_type="THREADSTATE">
<value type="UTF8" field="name" label="Name"/> <value type="UTF8" field="name" label="Name"/>
</content_type> </content_type>
<content_type id="GCName" hr_name="GC Name" <content_type id="GCName" hr_name="GC Name"
type="U1" jvm_type="GCNAME"> type="U8" jvm_type="GCNAME">
<value type="UTF8" field="name" label="name" /> <value type="UTF8" field="name" label="name" />
</content_type> </content_type>
<content_type id="GCCause" hr_name="GC Cause" <content_type id="GCCause" hr_name="GC Cause"
type="U2" jvm_type="GCCAUSE"> type="U8" jvm_type="GCCAUSE">
<value type="UTF8" field="cause" label="cause" /> <value type="UTF8" field="cause" label="cause" />
</content_type> </content_type>
<content_type id="GCWhen" hr_name="GC When" <content_type id="GCWhen" hr_name="GC When"
type="U1" jvm_type="GCWHEN"> type="U8" jvm_type="GCWHEN">
<value type="UTF8" field="when" label="when" /> <value type="UTF8" field="when" label="when" />
</content_type> </content_type>
<content_type id="G1HeapRegionType" hr_name="G1 Heap Region Type" <content_type id="G1HeapRegionType" hr_name="G1 Heap Region Type"
type="U1" jvm_type="G1HEAPREGIONTYPE"> type="U8" jvm_type="G1HEAPREGIONTYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="G1YCType" hr_name="G1 YC Type" <content_type id="G1YCType" hr_name="G1 YC Type"
type="U1" jvm_type="G1YCTYPE"> type="U8" jvm_type="G1YCTYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater" <content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater"
type="U1" jvm_type="GCTHRESHOLDUPDATER"> type="U8" jvm_type="GCTHRESHOLDUPDATER">
<value type="UTF8" field="updater" label="updater" /> <value type="UTF8" field="updater" label="updater" />
</content_type> </content_type>
<content_type id="ReferenceType" hr_name="Reference Type" <content_type id="ReferenceType" hr_name="Reference Type"
type="U1" jvm_type="REFERENCETYPE"> type="U8" jvm_type="REFERENCETYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="MetadataType" hr_name="Metadata Type" <content_type id="MetadataType" hr_name="Metadata Type"
type="U1" jvm_type="METADATATYPE"> type="U8" jvm_type="METADATATYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="MetaspaceObjectType" hr_name="Metaspace Object Type" <content_type id="MetaspaceObjectType" hr_name="Metaspace Object Type"
type="U1" jvm_type="METASPACEOBJTYPE"> type="U8" jvm_type="METASPACEOBJTYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode" <content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode"
type="U1" jvm_type="NARROWOOPMODE"> type="U8" jvm_type="NARROWOOPMODE">
<value type="UTF8" field="mode" label="mode" /> <value type="UTF8" field="mode" label="mode" />
</content_type> </content_type>
<content_type id="VMOperationType" hr_name="VM Operation Type" <content_type id="VMOperationType" hr_name="VM Operation Type"
type="U2" jvm_type="VMOPERATIONTYPE"> type="U8" jvm_type="VMOPERATIONTYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="CompilerPhaseType" hr_name="Compiler Phase Type" <content_type id="CompilerPhaseType" hr_name="Compiler Phase Type"
type="U1" jvm_type="COMPILERPHASETYPE"> type="U8" jvm_type="COMPILERPHASETYPE">
<value type="UTF8" field="phase" label="phase" /> <value type="UTF8" field="phase" label="phase" />
</content_type> </content_type>
<content_type id="FlagValueOrigin" hr_name="Flag Value Origin" <content_type id="FlagValueOrigin" hr_name="Flag Value Origin"
type="U1" jvm_type="FLAGVALUEORIGIN"> type="U8" jvm_type="FLAGVALUEORIGIN">
<value type="UTF8" field="origin" label="origin" /> <value type="UTF8" field="origin" label="origin" />
</content_type> </content_type>
<content_type id="CodeBlobType" hr_name="Code Blob Type" <content_type id="CodeBlobType" hr_name="Code Blob Type"
type="U1" jvm_type="CODEBLOBTYPE"> type="U8" jvm_type="CODEBLOBTYPE">
<value type="UTF8" field="type" label="type" /> <value type="UTF8" field="type" label="type" />
</content_type> </content_type>
<content_type id="InflateCause" hr_name="Inflation Cause" <content_type id="InflateCause" hr_name="Inflation Cause"
type="U1" jvm_type="INFLATECAUSE"> type="U8" jvm_type="INFLATECAUSE">
<value type="UTF8" field="cause" label="cause" /> <value type="UTF8" field="cause" label="cause" />
</content_type> </content_type>
</content_types> </content_types>
@ -245,11 +234,11 @@ Now we can use the content + data type in declaring event fields.
type="bool" sizeop="1"/> type="bool" sizeop="1"/>
<!-- 32-bit unsigned integer, SEMANTIC value BYTES --> <!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
<primary_type symbol="BYTES" datatype="U4" contenttype="BYTES" <primary_type symbol="BYTES" datatype="U8" contenttype="BYTES"
type="u4" sizeop="sizeof(u4)"/> type="u8" sizeop="sizeof(u8)"/>
<primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES" <primary_type symbol="IOBYTES" datatype="U8" contenttype="BYTES"
type="u4" sizeop="sizeof(u4)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- 64-bit unsigned integer, SEMANTIC value BYTES --> <!-- 64-bit unsigned integer, SEMANTIC value BYTES -->
<primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES" <primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES"
@ -280,122 +269,109 @@ Now we can use the content + data type in declaring event fields.
type="u8" sizeop="sizeof(u8)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) --> <!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) -->
<primary_type symbol="PERCENT" datatype="FLOAT" contenttype="PERCENTAGE" <primary_type symbol="PERCENTAGE" datatype="FLOAT" contenttype="PERCENTAGE"
type="float" sizeop="sizeof(float)"/> type="float" sizeop="sizeof(float)"/>
<!-- UTF-encoded string, max length 64k --> <!-- UTF8-encoded string, max length Integer.MAX_VALUE -->
<primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE" <primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
type="const char *" sizeop="sizeof_utf(%)"/> type="const char*" sizeop="sizeof_utf(%)"/>
<!-- UTF-16 encoded (Unicode) string, max length maxjuint -->
<primary_type symbol="STRING" datatype="STRING" contenttype="NONE"
type="TraceUnicodeString*" sizeop="sizeof_unicode(%)"/>
<!-- Symbol* constant. Note that this may currently ONLY be used by <!-- Symbol* constant. Note that this may currently ONLY be used by
classes, methods fields. This restriction might be lifted. --> classes, methods fields. This restriction might be lifted. -->
<primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL" <primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL"
type="Symbol *" sizeop="sizeof(u8)"/> type="const Symbol*" sizeop="sizeof(u8)"/>
<!-- A Klass *. The actual class is marked as "used" and will <!-- A Klass *. The actual class is marked as "used" and will
eventually be written into the recording constant pool --> eventually be written into the recording constant pool -->
<primary_type symbol="CLASS" datatype="U8" contenttype="CLASS" <primary_type symbol="CLASS" datatype="U8" contenttype="CLASS"
type="Klass *" sizeop="sizeof(u8)"/> type="const Klass*" sizeop="sizeof(u8)"/>
<!-- A Method *. The method is marked as "used" and will eventually be <!-- A Method *. The method is marked as "used" and will eventually be
written into the recording constant pool. --> written into the recording constant pool. -->
<primary_type symbol="METHOD" datatype="U8" contenttype="METHOD" <primary_type symbol="METHOD" datatype="U8" contenttype="METHOD"
type="Method *" sizeop="sizeof(u8)"/> type="const Method*" sizeop="sizeof(u8)"/>
<!-- The type for stacktraces in the recording. Shoudl not be used by <!-- The type for stacktraces in the recording. Shoudl not be used by
events explicitly --> events explicitly -->
<primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE" <primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
type="u8" sizeop="sizeof(u8)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- OS Thread ID --> <!-- Thread ID -->
<primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD" <primary_type symbol="THREAD" datatype="U8" contenttype="THREAD"
type="u4" sizeop="sizeof(u4)"/>
<!-- VM Thread ID Note: changed from U2 to U8 for hotspot -->
<primary_type symbol="VMTHREAD" datatype="U8" contenttype="VMTHREAD"
type="u8" sizeop="sizeof(u8)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- Java Thread ID -->
<primary_type symbol="JAVALANGTHREAD" datatype="LONG"
contenttype="JAVALANGTHREAD" type="s8"
sizeop="sizeof(s8)"/>
<!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only <!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
for thread constant pool // KK TODO: u8 should be ObjectP --> for thread constant pool // KK TODO: u8 should be ObjectP -->
<primary_type symbol="THREADGROUP" datatype="U4" contenttype="THREADGROUP" <primary_type symbol="THREADGROUP" datatype="U8" contenttype="THREADGROUP"
type="u8" type="u8"
sizeop="sizeof(u4)"/> sizeop="sizeof(u8)"/>
<!-- FRAMETYPE enum --> <!-- FRAMETYPE enum -->
<primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE" <primary_type symbol="FRAMETYPE" datatype="U8" contenttype="FRAMETYPE"
type="u1" sizeop="sizeof(u1)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- THREADSTATE enum --> <!-- THREADSTATE enum -->
<primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE" <primary_type symbol="THREADSTATE" datatype="U8" contenttype="THREADSTATE"
type="u2" sizeop="sizeof(u2)"/> type="u8" sizeop="sizeof(u8)"/>
<!-- GCName --> <!-- GCName -->
<primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME" <primary_type symbol="GCNAME" datatype="U8" contenttype="GCNAME"
type="u1" sizeop="sizeof(u1)" /> type="u8" sizeop="sizeof(u8)" />
<!-- GCCAUSE --> <!-- GCCAUSE -->
<primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE" <primary_type symbol="GCCAUSE" datatype="U8" contenttype="GCCAUSE"
type="u2" sizeop="sizeof(u2)" /> type="u8" sizeop="sizeof(u8)" />
<!-- GCWHEN --> <!-- GCWHEN -->
<primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN" <primary_type symbol="GCWHEN" datatype="U8" contenttype="GCWHEN"
type="u1" sizeop="sizeof(u1)" /> type="u8" sizeop="sizeof(u8)" />
<!-- G1HEAPREGIONTYPE --> <!-- G1HEAPREGIONTYPE -->
<primary_type symbol="G1HEAPREGIONTYPE" datatype="U1" contenttype="G1HEAPREGIONTYPE" <primary_type symbol="G1HEAPREGIONTYPE" datatype="U8" contenttype="G1HEAPREGIONTYPE"
type="u1" sizeop="sizeof(u1)" /> type="u8" sizeop="sizeof(u8)" />
<!-- G1YCType --> <!-- G1YCType -->
<primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE" <primary_type symbol="G1YCTYPE" datatype="U8" contenttype="G1YCTYPE"
type="u1" sizeop="sizeof(u1)" /> type="u8" sizeop="sizeof(u8)" />
<!-- GCTHRESHOLDUPDATER --> <!-- GCTHRESHOLDUPDATER -->
<primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER" <primary_type symbol="GCTHRESHOLDUPDATER" datatype="U8" contenttype="GCTHRESHOLDUPDATER"
type="u1" sizeop="sizeof(u1)" /> type="u8" sizeop="sizeof(u8)" />
<!-- REFERENCETYPE --> <!-- REFERENCETYPE -->
<primary_type symbol="REFERENCETYPE" datatype="U1" <primary_type symbol="REFERENCETYPE" datatype="U8"
contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" /> contenttype="REFERENCETYPE" type="u8" sizeop="sizeof(u8)" />
<!-- METADATATYPE --> <!-- METADATATYPE -->
<primary_type symbol="METADATATYPE" datatype="U1" <primary_type symbol="METADATATYPE" datatype="U8"
contenttype="METADATATYPE" type="u1" sizeop="sizeof(u1)" /> contenttype="METADATATYPE" type="u8" sizeop="sizeof(u8)" />
<!-- METADATAOBJTYPE --> <!-- METADATAOBJTYPE -->
<primary_type symbol="METASPACEOBJTYPE" datatype="U1" <primary_type symbol="METASPACEOBJTYPE" datatype="U8"
contenttype="METASPACEOBJTYPE" type="u1" sizeop="sizeof(u1)" /> contenttype="METASPACEOBJTYPE" type="u8" sizeop="sizeof(u8)" />
<!-- NARROWOOPMODE --> <!-- NARROWOOPMODE -->
<primary_type symbol="NARROWOOPMODE" datatype="U1" <primary_type symbol="NARROWOOPMODE" datatype="U8"
contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" /> contenttype="NARROWOOPMODE" type="u8" sizeop="sizeof(u8)" />
<!-- COMPILERPHASETYPE --> <!-- COMPILERPHASETYPE -->
<primary_type symbol="COMPILERPHASETYPE" datatype="U1" <primary_type symbol="COMPILERPHASETYPE" datatype="U8"
contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" /> contenttype="COMPILERPHASETYPE" type="u8" sizeop="sizeof(u8)" />
<!-- VMOPERATIONTYPE --> <!-- VMOPERATIONTYPE -->
<primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE" <primary_type symbol="VMOPERATIONTYPE" datatype="U8" contenttype="VMOPERATIONTYPE"
type="u2" sizeop="sizeof(u2)" /> type="u8" sizeop="sizeof(u8)" />
<!-- FLAGVALUEORIGIN --> <!-- FLAGVALUEORIGIN -->
<primary_type symbol="FLAGVALUEORIGIN" datatype="U1" <primary_type symbol="FLAGVALUEORIGIN" datatype="U8"
contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" /> contenttype="FLAGVALUEORIGIN" type="u8" sizeop="sizeof(u8)" />
<!-- CODEBLOBTYPE --> <!-- CODEBLOBTYPE -->
<primary_type symbol="CODEBLOBTYPE" datatype="U1" <primary_type symbol="CODEBLOBTYPE" datatype="U8"
contenttype="CODEBLOBTYPE" type="u1" sizeop="sizeof(u1)" /> contenttype="CODEBLOBTYPE" type="u8" sizeop="sizeof(u8)" />
<!-- INFLATECAUSE --> <!-- INFLATECAUSE -->
<primary_type symbol="INFLATECAUSE" datatype="U1" <primary_type symbol="INFLATECAUSE" datatype="U8"
contenttype="INFLATECAUSE" type="u1" sizeop="sizeof(u1)" /> contenttype="INFLATECAUSE" type="u8" sizeop="sizeof(u8)" />
</primary_types> </primary_types>
</types> </types>

View file

@ -51,9 +51,14 @@
#include "services/heapDumper.hpp" #include "services/heapDumper.hpp"
#include "utilities/defaultStream.hpp" #include "utilities/defaultStream.hpp"
#include "utilities/events.hpp" #include "utilities/events.hpp"
#include "utilities/macros.hpp"
#include "utilities/top.hpp" #include "utilities/top.hpp"
#include "utilities/vmError.hpp" #include "utilities/vmError.hpp"
#if INCLUDE_TRACE
#include "trace/tracing.hpp"
#endif
#ifndef ASSERT #ifndef ASSERT
# ifdef _DEBUG # ifdef _DEBUG
// NOTE: don't turn the lines below into a comment -- if you're getting // NOTE: don't turn the lines below into a comment -- if you're getting
@ -280,6 +285,12 @@ void report_out_of_shared_space(SharedSpaceType shared_space) {
exit(2); exit(2);
} }
static void notify_tracing() {
#if INCLUDE_TRACE
Tracing::on_vm_error(true);
#endif
}
void report_insufficient_metaspace(size_t required_size) { void report_insufficient_metaspace(size_t required_size) {
warning("\nThe MaxMetaspaceSize of " SIZE_FORMAT " bytes is not large enough.\n" warning("\nThe MaxMetaspaceSize of " SIZE_FORMAT " bytes is not large enough.\n"
"Either don't specify the -XX:MaxMetaspaceSize=<size>\n" "Either don't specify the -XX:MaxMetaspaceSize=<size>\n"
@ -302,6 +313,8 @@ void report_java_out_of_memory(const char* message) {
HeapDumper::dump_heap_from_oome(); HeapDumper::dump_heap_from_oome();
} }
notify_tracing();
if (OnOutOfMemoryError && OnOutOfMemoryError[0]) { if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
VMError::report_java_out_of_memory(message); VMError::report_java_out_of_memory(message);
} }

View file

@ -383,4 +383,9 @@ template class BasicHashtable<mtClassShared>;
template class BasicHashtable<mtSymbol>; template class BasicHashtable<mtSymbol>;
template class BasicHashtable<mtCode>; template class BasicHashtable<mtCode>;
template class BasicHashtable<mtInternal>; template class BasicHashtable<mtInternal>;
#if INCLUDE_TRACE
template class Hashtable<Symbol*, mtTracing>;
template class HashtableEntry<Symbol*, mtTracing>;
template class BasicHashtable<mtTracing>;
#endif
template class BasicHashtable<mtCompiler>; template class BasicHashtable<mtCompiler>;