8143226: Minor updates to Event Based tracing
Reviewed-by: jbachorik, egahlin
This commit is contained in:
parent
12d9b13eee
commit
0e44e963d2
@ -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.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
|
||||
TraceGeneratedNames += \
|
||||
traceRequestables.hpp \
|
||||
traceEventControl.hpp
|
||||
|
||||
ifneq ($(INCLUDE_TRACE), false)
|
||||
TraceGeneratedNames += traceProducer.cpp
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
|
||||
@ -100,9 +95,6 @@ else
|
||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||
$(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)
|
||||
$(GENERATE_CODE)
|
||||
|
||||
|
@ -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.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
|
||||
TraceGeneratedNames += \
|
||||
traceRequestables.hpp \
|
||||
traceEventControl.hpp
|
||||
|
||||
ifneq ($(INCLUDE_TRACE), false)
|
||||
TraceGeneratedNames += traceProducer.cpp
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@ -101,9 +96,6 @@ else
|
||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||
$(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)
|
||||
$(GENERATE_CODE)
|
||||
|
||||
|
@ -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.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
|
||||
TraceGeneratedNames += \
|
||||
traceRequestables.hpp \
|
||||
traceEventControl.hpp
|
||||
|
||||
ifneq ($(INCLUDE_TRACE), false)
|
||||
TraceGeneratedNames += traceProducer.cpp
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
|
||||
@ -100,9 +95,6 @@ else
|
||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||
$(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)
|
||||
$(GENERATE_CODE)
|
||||
|
||||
|
@ -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.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -56,8 +56,7 @@ TraceGeneratedNames = \
|
||||
ifeq ($(HAS_ALT_SRC), true)
|
||||
TraceGeneratedNames += \
|
||||
traceRequestables.hpp \
|
||||
traceEventControl.hpp \
|
||||
traceProducer.cpp
|
||||
traceEventControl.hpp
|
||||
endif
|
||||
|
||||
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
|
||||
@ -96,9 +95,6 @@ else
|
||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||
$(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)
|
||||
$(GENERATE_CODE)
|
||||
|
||||
|
@ -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.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -43,8 +43,7 @@ TraceGeneratedNames = \
|
||||
!if EXISTS($(TraceAltSrcDir))
|
||||
TraceGeneratedNames = $(TraceGeneratedNames) \
|
||||
traceRequestables.hpp \
|
||||
traceEventControl.hpp \
|
||||
traceProducer.cpp
|
||||
traceEventControl.hpp
|
||||
!endif
|
||||
|
||||
|
||||
@ -58,8 +57,7 @@ TraceGeneratedFiles = \
|
||||
!if EXISTS($(TraceAltSrcDir))
|
||||
TraceGeneratedFiles = $(TraceGeneratedFiles) \
|
||||
$(TraceOutDir)/traceRequestables.hpp \
|
||||
$(TraceOutDir)/traceEventControl.hpp \
|
||||
$(TraceOutDir)/traceProducer.cpp
|
||||
$(TraceOutDir)/traceEventControl.hpp
|
||||
!endif
|
||||
|
||||
XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen
|
||||
@ -98,10 +96,6 @@ $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)
|
||||
@echo Generating AltSrc $@
|
||||
@$(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)
|
||||
@echo Generating AltSrc $@
|
||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp
|
||||
|
@ -228,8 +228,6 @@ bool Compiler::is_intrinsic_supported(const methodHandle& method) {
|
||||
case vmIntrinsics::_getCharStringU:
|
||||
case vmIntrinsics::_putCharStringU:
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
case vmIntrinsics::_classID:
|
||||
case vmIntrinsics::_threadID:
|
||||
case vmIntrinsics::_counterTime:
|
||||
#endif
|
||||
break;
|
||||
|
@ -43,6 +43,9 @@
|
||||
#if INCLUDE_ALL_GCS
|
||||
#include "gc/g1/heapRegion.hpp"
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
#include "trace/traceMacros.hpp"
|
||||
#endif
|
||||
|
||||
#ifdef ASSERT
|
||||
#define __ gen()->lir(__FILE__, __LINE__)->
|
||||
@ -3067,42 +3070,7 @@ void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
|
||||
__ 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) {
|
||||
switch (x->id()) {
|
||||
@ -3115,8 +3083,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
|
||||
}
|
||||
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break;
|
||||
case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break;
|
||||
case vmIntrinsics::_counterTime:
|
||||
do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
|
||||
break;
|
||||
|
@ -440,10 +440,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
||||
void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
|
||||
|
||||
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,
|
||||
Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k,
|
||||
ciKlass* callee_signature_k);
|
||||
|
@ -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.
|
||||
// Now remove the InstanceKlass* from the _klass_to_deallocate field
|
||||
|
@ -328,8 +328,6 @@ bool vmIntrinsics::preserves_state(vmIntrinsics::ID id) {
|
||||
assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
|
||||
switch(id) {
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
case vmIntrinsics::_classID:
|
||||
case vmIntrinsics::_threadID:
|
||||
case vmIntrinsics::_counterTime:
|
||||
#endif
|
||||
case vmIntrinsics::_currentTimeMillis:
|
||||
|
@ -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.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
#define SHARE_VM_GC_SHARED_COPYFAILEDINFO_HPP
|
||||
|
||||
#include "runtime/thread.hpp"
|
||||
#include "trace/traceMacros.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
|
||||
class CopyFailedInfo : public CHeapObj<mtGC> {
|
||||
@ -63,26 +64,28 @@ class CopyFailedInfo : public CHeapObj<mtGC> {
|
||||
};
|
||||
|
||||
class PromotionFailedInfo : public CopyFailedInfo {
|
||||
OSThread* _thread;
|
||||
traceid _thread_trace_id;
|
||||
|
||||
public:
|
||||
PromotionFailedInfo() : CopyFailedInfo(), _thread(NULL) {}
|
||||
PromotionFailedInfo() : CopyFailedInfo(), _thread_trace_id(0) {}
|
||||
|
||||
void register_copy_failure(size_t size) {
|
||||
CopyFailedInfo::register_copy_failure(size);
|
||||
if (_thread == NULL) {
|
||||
_thread = Thread::current()->osthread();
|
||||
if (_thread_trace_id == 0) {
|
||||
_thread_trace_id = THREAD_TRACE_ID(Thread::current());
|
||||
} 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() {
|
||||
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 {};
|
||||
|
@ -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.
|
||||
*
|
||||
* 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()) {
|
||||
e.set_gcId(GCId::current());
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ ArrayKlass::ArrayKlass(Symbol* name) :
|
||||
set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
|
||||
set_layout_helper(Klass::_lh_neutral_value);
|
||||
set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
|
||||
TRACE_INIT_ID(this);
|
||||
TRACE_INIT_KLASS_ID(this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -839,7 +839,7 @@ public:
|
||||
|
||||
// support for stub routines
|
||||
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)); }
|
||||
|
||||
// subclass/subinterface checks
|
||||
|
@ -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.
|
||||
*
|
||||
* 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) {
|
||||
TRACE_INIT_ID(this);
|
||||
TRACE_INIT_KLASS_ID(this);
|
||||
// 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
|
||||
// modify the CLD list outside a safepoint.
|
||||
|
@ -132,7 +132,7 @@ class Klass : public Metadata {
|
||||
jint _modifier_flags; // Processed access flags, for use by Class.getModifiers.
|
||||
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
|
||||
// (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; }
|
||||
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
|
||||
void oops_do(OopClosure* cl);
|
||||
|
@ -400,8 +400,6 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
|
||||
case vmIntrinsics::_currentThread:
|
||||
case vmIntrinsics::_isInterrupted:
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
case vmIntrinsics::_classID:
|
||||
case vmIntrinsics::_threadID:
|
||||
case vmIntrinsics::_counterTime:
|
||||
#endif
|
||||
case vmIntrinsics::_currentTimeMillis:
|
||||
|
@ -49,7 +49,9 @@
|
||||
#include "opto/subnode.hpp"
|
||||
#include "prims/nativeLookup.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
#ifdef TRACE_HAVE_INTRINSICS
|
||||
#include "trace/traceMacros.hpp"
|
||||
#endif
|
||||
|
||||
class LibraryIntrinsic : public InlineCallGenerator {
|
||||
// Extend the set of intrinsics known to the runtime:
|
||||
@ -246,10 +248,7 @@ class LibraryCallKit : public GraphKit {
|
||||
bool inline_unsafe_allocate();
|
||||
bool inline_unsafe_copyMemory();
|
||||
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_isInterrupted();
|
||||
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();
|
||||
|
||||
#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");
|
||||
#endif
|
||||
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;
|
||||
}
|
||||
|
||||
#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 code for System.currentTimeMillis() and System.nanoTime()
|
||||
// these have the same type and signature
|
||||
|
@ -73,6 +73,7 @@
|
||||
#include "runtime/vm_operations.hpp"
|
||||
#include "services/memTracker.hpp"
|
||||
#include "services/runtimeService.hpp"
|
||||
#include "trace/traceMacros.hpp"
|
||||
#include "trace/tracing.hpp"
|
||||
#include "utilities/defaultStream.hpp"
|
||||
#include "utilities/dtrace.hpp"
|
||||
@ -3929,7 +3930,7 @@ static jint JNI_CreateJavaVM_inner(JavaVM **vm, void **penv, void *args) {
|
||||
|
||||
EventThreadStart event;
|
||||
if (event.should_commit()) {
|
||||
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
|
||||
event.set_thread(THREAD_TRACE_ID(thread));
|
||||
event.commit();
|
||||
}
|
||||
|
||||
@ -4149,7 +4150,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
|
||||
|
||||
EventThreadStart event;
|
||||
if (event.should_commit()) {
|
||||
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
|
||||
event.set_thread(THREAD_TRACE_ID(thread));
|
||||
event.commit();
|
||||
}
|
||||
|
||||
|
@ -64,6 +64,7 @@
|
||||
#include "runtime/timer.hpp"
|
||||
#include "runtime/vm_operations.hpp"
|
||||
#include "services/memTracker.hpp"
|
||||
#include "trace/traceMacros.hpp"
|
||||
#include "trace/tracing.hpp"
|
||||
#include "utilities/dtrace.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
@ -485,7 +486,7 @@ void before_exit(JavaThread* thread) {
|
||||
|
||||
EventThreadEnd event;
|
||||
if (event.should_commit()) {
|
||||
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
|
||||
event.set_thread(THREAD_TRACE_ID(thread));
|
||||
event.commit();
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
* 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()) {
|
||||
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.commit();
|
||||
}
|
||||
@ -937,7 +937,7 @@ void NOINLINE ObjectMonitor::exit(bool not_suspended, TRAPS) {
|
||||
// get the owner's thread id for the MonitorEnter event
|
||||
// if it is enabled and the thread isn't suspended
|
||||
if (not_suspended && Tracing::is_event_enabled(TraceJavaMonitorEnterEvent)) {
|
||||
_previous_owner_tid = SharedRuntime::get_java_tid(Self);
|
||||
_previous_owner_tid = THREAD_TRACE_ID(Self);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1391,11 +1391,12 @@ void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
|
||||
jlong notifier_tid,
|
||||
jlong timeout,
|
||||
bool timedout) {
|
||||
assert(event != NULL, "invariant");
|
||||
event->set_klass(((oop)this->object())->klass());
|
||||
event->set_timeout((TYPE_ULONG)timeout);
|
||||
event->set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
|
||||
event->set_notifier((TYPE_OSTHREAD)notifier_tid);
|
||||
event->set_timedOut((TYPE_BOOLEAN)timedout);
|
||||
event->set_timeout(timeout);
|
||||
event->set_address((TYPE_ADDRESS)this->object_addr());
|
||||
event->set_notifier(notifier_tid);
|
||||
event->set_timedOut(timedout);
|
||||
event->commit();
|
||||
}
|
||||
|
||||
@ -1655,7 +1656,7 @@ void ObjectMonitor::INotify(Thread * Self) {
|
||||
iterator->TState = ObjectWaiter::TS_ENTER;
|
||||
}
|
||||
iterator->_notified = 1;
|
||||
iterator->_notifier_tid = Self->osthread()->thread_id();
|
||||
iterator->_notifier_tid = THREAD_TRACE_ID(Self);
|
||||
|
||||
ObjectWaiter * list = _EntryList;
|
||||
if (list != NULL) {
|
||||
|
@ -1694,7 +1694,7 @@ void JavaThread::run() {
|
||||
|
||||
EventThreadStart event;
|
||||
if (event.should_commit()) {
|
||||
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
|
||||
event.set_thread(THREAD_TRACE_ID(this));
|
||||
event.commit();
|
||||
}
|
||||
|
||||
@ -1799,7 +1799,7 @@ void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
|
||||
// from java_lang_Thread object
|
||||
EventThreadEnd event;
|
||||
if (event.should_commit()) {
|
||||
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
|
||||
event.set_thread(THREAD_TRACE_ID(this));
|
||||
event.commit();
|
||||
}
|
||||
|
||||
@ -3554,6 +3554,10 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||
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
|
||||
main_thread->cache_global_variables();
|
||||
|
||||
@ -3622,11 +3626,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||
|
||||
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.
|
||||
StubCodeDesc::freeze();
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
* 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; }
|
||||
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; }
|
||||
ThreadExt& ext() { return _ext; }
|
||||
|
@ -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.
|
||||
*
|
||||
* 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.
|
||||
// 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.
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
|
||||
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>
|
||||
<event id="ThreadStart" path="java/thread_start" label="Java Thread Start"
|
||||
has_thread="true" is_instant="true">
|
||||
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/>
|
||||
<value type="THREAD" field="thread" label="Java Thread"/>
|
||||
</event>
|
||||
|
||||
<event id="ThreadEnd" path="java/thread_end" label="Java Thread End"
|
||||
has_thread="true" is_instant="true">
|
||||
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/>
|
||||
<value type="THREAD" field="thread" label="Java Thread"/>
|
||||
</event>
|
||||
|
||||
<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"
|
||||
has_thread="true" has_stacktrace="true" is_instant="false">
|
||||
<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"/>
|
||||
</event>
|
||||
|
||||
<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">
|
||||
<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="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"/>
|
||||
@ -434,7 +434,7 @@ Declares a structure type that can be used in other events.
|
||||
description="Promotion of an object failed">
|
||||
<value type="UINT" field="gcId" label="GC ID" relation="GC_ID"/>
|
||||
<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 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" />
|
||||
</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 -->
|
||||
|
||||
<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="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="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>
|
||||
|
||||
<!-- Allocation events -->
|
||||
|
@ -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.
|
||||
*
|
||||
* 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_vm_error(bool) {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class TraceThreadData {
|
||||
|
@ -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.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,39 +31,32 @@
|
||||
|
||||
enum {
|
||||
CONTENT_TYPE_NONE = 0,
|
||||
CONTENT_TYPE_BYTES = 1,
|
||||
CONTENT_TYPE_EPOCHMILLIS = 2,
|
||||
CONTENT_TYPE_MILLIS = 3,
|
||||
CONTENT_TYPE_NANOS = 4,
|
||||
CONTENT_TYPE_TICKS = 5,
|
||||
CONTENT_TYPE_ADDRESS = 6,
|
||||
CONTENT_TYPE_CLASS = 20,
|
||||
CONTENT_TYPE_UTF8 = 21,
|
||||
CONTENT_TYPE_THREAD = 22,
|
||||
CONTENT_TYPE_STACKTRACE = 23,
|
||||
CONTENT_TYPE_BYTES = 24,
|
||||
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,
|
||||
CONTENT_TYPE_JAVALANGTHREAD,
|
||||
CONTENT_TYPE_STACKTRACE,
|
||||
CONTENT_TYPE_CLASS,
|
||||
CONTENT_TYPE_PERCENTAGE,
|
||||
|
||||
JVM_CONTENT_TYPES_START = 30,
|
||||
JVM_CONTENT_TYPES_END = 100
|
||||
JVM_CONTENT_TYPES_START = 33,
|
||||
JVM_CONTENT_TYPES_END = 255
|
||||
};
|
||||
|
||||
enum ReservedEvent {
|
||||
EVENT_PRODUCERS,
|
||||
EVENT_METADATA,
|
||||
EVENT_CHECKPOINT,
|
||||
EVENT_BUFFERLOST,
|
||||
|
||||
NUM_RESERVED_EVENTS
|
||||
NUM_RESERVED_EVENTS = JVM_CONTENT_TYPES_END
|
||||
};
|
||||
|
||||
typedef enum ReservedEvent ReservedEvent;
|
||||
|
||||
typedef u8 classid;
|
||||
typedef u8 stacktraceid;
|
||||
typedef u8 methodid;
|
||||
typedef u8 fieldid;
|
||||
|
||||
class TraceUnicodeString;
|
||||
class Symbol;
|
||||
|
||||
#endif // SHARE_VM_TRACE_TRACEDATATYPES_HPP
|
||||
|
||||
|
@ -99,8 +99,13 @@ class TraceEvent : public StackObj {
|
||||
cancel();
|
||||
return;
|
||||
}
|
||||
if (_endTime == 0) {
|
||||
static_cast<T*>(this)->set_endtime(Tracing::time());
|
||||
|
||||
if (_startTime == 0) {
|
||||
static_cast<T*>(this)->set_starttime(Tracing::time());
|
||||
} else {
|
||||
if (_endTime == 0) {
|
||||
static_cast<T*>(this)->set_endtime(Tracing::time());
|
||||
}
|
||||
}
|
||||
if (static_cast<T*>(this)->should_write()) {
|
||||
static_cast<T*>(this)->writeEvent();
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -52,8 +52,8 @@
|
||||
class TraceEvent {
|
||||
public:
|
||||
TraceEvent() {}
|
||||
void set_starttime(const Ticks& time) {}
|
||||
void set_endtime(const Ticks& time) {}
|
||||
void set_starttime(const Ticks& ignore) {}
|
||||
void set_endtime(const Ticks& ignore) {}
|
||||
bool should_commit() const { return false; }
|
||||
static bool is_enabled() { return false; }
|
||||
void commit() {}
|
||||
|
@ -43,7 +43,7 @@ enum TraceEventId {
|
||||
_traceeventbase = (NUM_RESERVED_EVENTS-1), // Make sure we start at right index.
|
||||
|
||||
// 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:for-each>
|
||||
MaxTraceEventId
|
||||
|
@ -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.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,19 +25,28 @@
|
||||
#ifndef SHARE_VM_TRACE_TRACEMACROS_HPP
|
||||
#define SHARE_VM_TRACE_TRACEMACROS_HPP
|
||||
|
||||
typedef u8 traceid;
|
||||
|
||||
#define EVENT_THREAD_EXIT(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 THREAD_TRACE_ID(thread) ((traceid)thread->osthread()->thread_id())
|
||||
#define TRACE_START() JNI_OK
|
||||
#define TRACE_INITIALIZE() JNI_OK
|
||||
|
||||
#define TRACE_DEFINE_KLASS_METHODS typedef int ___IGNORED_hs_trace_type1
|
||||
#define TRACE_DEFINE_KLASS_TRACE_ID typedef int ___IGNORED_hs_trace_type2
|
||||
#define TRACE_DEFINE_OFFSET typedef int ___IGNORED_hs_trace_type3
|
||||
#define TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere()
|
||||
#define TRACE_DEFINE_TRACE_ID_METHODS typedef int ___IGNORED_hs_trace_type1
|
||||
#define TRACE_DEFINE_TRACE_ID_FIELD typedef int ___IGNORED_hs_trace_type2
|
||||
#define TRACE_DEFINE_KLASS_TRACE_ID_OFFSET typedef int ___IGNORED_hs_trace_type3
|
||||
#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_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias)
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
|
||||
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>
|
||||
<content_types>
|
||||
<content_type id="Thread" hr_name="Thread"
|
||||
type="U4" builtin_type="OSTHREAD">
|
||||
<value type="UTF8" field="name" label="Thread name"/>
|
||||
</content_type>
|
||||
|
||||
<content_type id="VMThread" hr_name="VM Thread"
|
||||
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"/>
|
||||
type="U8" builtin_type="THREAD">
|
||||
<value type="UTF8" field="osName" label="OS Thread Name"/>
|
||||
<value type="LONG" field="osThreadID" label="OS Thread ID"/>
|
||||
<value type="UTF8" field="javaName" label="Java Lang Thread Name"/>
|
||||
<value type="LONG" field="javaThreadID" label="Java Lang Thread ID"/>
|
||||
<value type="THREADGROUP" field="group" label="Java Thread Group"/>
|
||||
</content_type>
|
||||
|
||||
<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="UTF8" field="name" label="Name"/>
|
||||
</content_type>
|
||||
@ -107,82 +96,82 @@ Now we can use the content + data type in declaring event fields.
|
||||
</content_type>
|
||||
|
||||
<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"/>
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_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" />
|
||||
</content_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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_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" />
|
||||
</content_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" />
|
||||
</content_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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_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" />
|
||||
</content_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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_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" />
|
||||
</content_type>
|
||||
|
||||
<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" />
|
||||
</content_type>
|
||||
</content_types>
|
||||
@ -245,11 +234,11 @@ Now we can use the content + data type in declaring event fields.
|
||||
type="bool" sizeop="1"/>
|
||||
|
||||
<!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
|
||||
<primary_type symbol="BYTES" datatype="U4" contenttype="BYTES"
|
||||
type="u4" sizeop="sizeof(u4)"/>
|
||||
<primary_type symbol="BYTES" datatype="U8" contenttype="BYTES"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES"
|
||||
type="u4" sizeop="sizeof(u4)"/>
|
||||
<primary_type symbol="IOBYTES" datatype="U8" contenttype="BYTES"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- 64-bit unsigned integer, SEMANTIC value 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)"/>
|
||||
|
||||
<!-- 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)"/>
|
||||
|
||||
<!-- UTF-encoded string, max length 64k -->
|
||||
<!-- UTF8-encoded string, max length Integer.MAX_VALUE -->
|
||||
<primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
|
||||
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(%)"/>
|
||||
type="const char*" sizeop="sizeof_utf(%)"/>
|
||||
|
||||
<!-- Symbol* constant. Note that this may currently ONLY be used by
|
||||
classes, methods fields. This restriction might be lifted. -->
|
||||
<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
|
||||
eventually be written into the recording constant pool -->
|
||||
<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
|
||||
written into the recording constant pool. -->
|
||||
<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
|
||||
events explicitly -->
|
||||
<primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- OS Thread ID -->
|
||||
<primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD"
|
||||
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)"/>
|
||||
|
||||
<!-- Java Thread ID -->
|
||||
<primary_type symbol="JAVALANGTHREAD" datatype="LONG"
|
||||
contenttype="JAVALANGTHREAD" type="s8"
|
||||
sizeop="sizeof(s8)"/>
|
||||
<!-- Thread ID -->
|
||||
<primary_type symbol="THREAD" datatype="U8" contenttype="THREAD"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
|
||||
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"
|
||||
sizeop="sizeof(u4)"/>
|
||||
sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- FRAMETYPE enum -->
|
||||
<primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE"
|
||||
type="u1" sizeop="sizeof(u1)"/>
|
||||
<primary_type symbol="FRAMETYPE" datatype="U8" contenttype="FRAMETYPE"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- THREADSTATE enum -->
|
||||
<primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE"
|
||||
type="u2" sizeop="sizeof(u2)"/>
|
||||
<primary_type symbol="THREADSTATE" datatype="U8" contenttype="THREADSTATE"
|
||||
type="u8" sizeop="sizeof(u8)"/>
|
||||
|
||||
<!-- GCName -->
|
||||
<primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME"
|
||||
type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="GCNAME" datatype="U8" contenttype="GCNAME"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- GCCAUSE -->
|
||||
<primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE"
|
||||
type="u2" sizeop="sizeof(u2)" />
|
||||
<primary_type symbol="GCCAUSE" datatype="U8" contenttype="GCCAUSE"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- GCWHEN -->
|
||||
<primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN"
|
||||
type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="GCWHEN" datatype="U8" contenttype="GCWHEN"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- G1HEAPREGIONTYPE -->
|
||||
<primary_type symbol="G1HEAPREGIONTYPE" datatype="U1" contenttype="G1HEAPREGIONTYPE"
|
||||
type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="G1HEAPREGIONTYPE" datatype="U8" contenttype="G1HEAPREGIONTYPE"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- G1YCType -->
|
||||
<primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE"
|
||||
type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="G1YCTYPE" datatype="U8" contenttype="G1YCTYPE"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- GCTHRESHOLDUPDATER -->
|
||||
<primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER"
|
||||
type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="GCTHRESHOLDUPDATER" datatype="U8" contenttype="GCTHRESHOLDUPDATER"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- REFERENCETYPE -->
|
||||
<primary_type symbol="REFERENCETYPE" datatype="U1"
|
||||
contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="REFERENCETYPE" datatype="U8"
|
||||
contenttype="REFERENCETYPE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- METADATATYPE -->
|
||||
<primary_type symbol="METADATATYPE" datatype="U1"
|
||||
contenttype="METADATATYPE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="METADATATYPE" datatype="U8"
|
||||
contenttype="METADATATYPE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- METADATAOBJTYPE -->
|
||||
<primary_type symbol="METASPACEOBJTYPE" datatype="U1"
|
||||
contenttype="METASPACEOBJTYPE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="METASPACEOBJTYPE" datatype="U8"
|
||||
contenttype="METASPACEOBJTYPE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- NARROWOOPMODE -->
|
||||
<primary_type symbol="NARROWOOPMODE" datatype="U1"
|
||||
contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="NARROWOOPMODE" datatype="U8"
|
||||
contenttype="NARROWOOPMODE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- COMPILERPHASETYPE -->
|
||||
<primary_type symbol="COMPILERPHASETYPE" datatype="U1"
|
||||
contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="COMPILERPHASETYPE" datatype="U8"
|
||||
contenttype="COMPILERPHASETYPE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- VMOPERATIONTYPE -->
|
||||
<primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE"
|
||||
type="u2" sizeop="sizeof(u2)" />
|
||||
<primary_type symbol="VMOPERATIONTYPE" datatype="U8" contenttype="VMOPERATIONTYPE"
|
||||
type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- FLAGVALUEORIGIN -->
|
||||
<primary_type symbol="FLAGVALUEORIGIN" datatype="U1"
|
||||
contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="FLAGVALUEORIGIN" datatype="U8"
|
||||
contenttype="FLAGVALUEORIGIN" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- CODEBLOBTYPE -->
|
||||
<primary_type symbol="CODEBLOBTYPE" datatype="U1"
|
||||
contenttype="CODEBLOBTYPE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="CODEBLOBTYPE" datatype="U8"
|
||||
contenttype="CODEBLOBTYPE" type="u8" sizeop="sizeof(u8)" />
|
||||
|
||||
<!-- INFLATECAUSE -->
|
||||
<primary_type symbol="INFLATECAUSE" datatype="U1"
|
||||
contenttype="INFLATECAUSE" type="u1" sizeop="sizeof(u1)" />
|
||||
<primary_type symbol="INFLATECAUSE" datatype="U8"
|
||||
contenttype="INFLATECAUSE" type="u8" sizeop="sizeof(u8)" />
|
||||
</primary_types>
|
||||
</types>
|
||||
|
@ -51,9 +51,14 @@
|
||||
#include "services/heapDumper.hpp"
|
||||
#include "utilities/defaultStream.hpp"
|
||||
#include "utilities/events.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
#include "utilities/top.hpp"
|
||||
#include "utilities/vmError.hpp"
|
||||
|
||||
#if INCLUDE_TRACE
|
||||
#include "trace/tracing.hpp"
|
||||
#endif
|
||||
|
||||
#ifndef ASSERT
|
||||
# ifdef _DEBUG
|
||||
// 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);
|
||||
}
|
||||
|
||||
static void notify_tracing() {
|
||||
#if INCLUDE_TRACE
|
||||
Tracing::on_vm_error(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void report_insufficient_metaspace(size_t required_size) {
|
||||
warning("\nThe MaxMetaspaceSize of " SIZE_FORMAT " bytes is not large enough.\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();
|
||||
}
|
||||
|
||||
notify_tracing();
|
||||
|
||||
if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
|
||||
VMError::report_java_out_of_memory(message);
|
||||
}
|
||||
|
@ -383,4 +383,9 @@ template class BasicHashtable<mtClassShared>;
|
||||
template class BasicHashtable<mtSymbol>;
|
||||
template class BasicHashtable<mtCode>;
|
||||
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>;
|
||||
|
Loading…
Reference in New Issue
Block a user