--- /dev/null 2016-10-25 08:46:44.038854975 +0200
+++ new/src/share/vm/evtrace/traceReaderThread.cpp 2016-10-25 10:40:15.418781656 +0200
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2014, 2015, Dynatrace and/or its affiliates. All rights reserved.
+ *
+ * This file is part of the Lock Contention Tracing Subsystem for the HotSpot
+ * Virtual Machine, which is developed at Christian Doppler Laboratory on
+ * Monitoring and Evolution of Very-Large-Scale Software Systems. Please
+ * contact us at if you need additional information
+ * or have any questions.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work. If not, see .
+ *
+ */
+
+#include "evtrace/traceReaderThread.hpp"
+
+#include "evtrace/traceManager.hpp"
+
+#include "runtime/javaCalls.hpp"
+
+TraceReaderThread::TraceReaderThread(oop obj)
+: JavaThread(trace_reader_thread_entry),
+ _object(obj),
+ _is_polling_queue(false)
+{
+}
+
+TraceReaderThread::~TraceReaderThread() {
+ TraceManager::thread_is_exiting(this);
+}
+
+void TraceReaderThread::trace_reader_thread_entry(JavaThread* thread, TRAPS) {
+ TraceReaderThread *self = (TraceReaderThread *) thread;
+ JavaValue result(T_VOID);
+ Klass* klass = SystemDictionary::resolve_or_fail(vmSymbols::sun_evtracing_TraceReaderThread(), true, CHECK);
+ JavaCalls::call_virtual(&result,
+ self->_object,
+ klass,
+ vmSymbols::run_method_name(),
+ vmSymbols::void_method_signature(),
+ CHECK);
+}
+
+TraceReaderThread* TraceReaderThread::start(Handle flushq, Handle freeq, TRAPS) {
+ Klass* rt_klass = SystemDictionary::resolve_or_fail(vmSymbols::sun_evtracing_TraceReaderThread(), true, CHECK_NULL);
+ instanceKlassHandle rt_khandle(THREAD, rt_klass);
+ rt_khandle->initialize(CHECK_NULL);
+ instanceHandle rt_obj = rt_khandle->allocate_instance_handle(CHECK_NULL);
+
+ JavaValue result(T_VOID);
+ JavaCalls::call_special(&result,
+ rt_obj,
+ rt_khandle,
+ vmSymbols::object_initializer_name(),
+ vmSymbols::TraceReaderThread_constructor_signature(),
+ flushq,
+ freeq,
+ CHECK_NULL);
+
+ Klass* t_klass = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL);
+ instanceKlassHandle t_khandle(THREAD, t_klass);
+ instanceHandle t_obj = t_khandle->allocate_instance_handle(CHECK_NULL);
+
+ const char thread_name[] = "Trace Reader Thread";
+ Handle string = java_lang_String::create_from_str(thread_name, CHECK_NULL);
+
+ // Initialize thread_oop to put it into the system threadGroup
+ Handle thread_group(THREAD, Universe::system_thread_group());
+ JavaCalls::call_special(&result,
+ t_obj,
+ t_khandle,
+ vmSymbols::object_initializer_name(),
+ vmSymbols::threadgroup_string_void_signature(),
+ thread_group,
+ string,
+ CHECK_NULL);
+
+ TraceReaderThread *trt = NULL;
+ {
+ MutexLocker mu(Threads_lock);
+ trt = new TraceReaderThread(rt_obj());
+
+ if (trt == NULL || trt->osthread() == NULL) {
+ vm_exit_during_initialization("java.lang.OutOfMemoryError", "unable to create new native thread");
+ }
+ java_lang_Thread::set_thread(t_obj(), trt);
+ java_lang_Thread::set_daemon(t_obj());
+
+ trt->set_threadObj(t_obj());
+ Threads::add(trt);
+ Thread::start(trt);
+ }
+ return trt;
+}
+
+void TraceReaderThread::shutdown(TRAPS) {
+ Klass* rt_klass = SystemDictionary::resolve_or_fail(vmSymbols::sun_evtracing_TraceReaderThread(), true, CHECK);
+ instanceKlassHandle rt_khandle(THREAD, rt_klass);
+
+ JavaValue result(T_VOID);
+ JavaCalls::call_virtual(&result,
+ Handle(_object),
+ rt_khandle,
+ vmSymbols::shutdown_method_name(),
+ vmSymbols::void_method_signature(),
+ CHECK);
+}
+
+void TraceReaderThread::oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf) {
+ JavaThread::oops_do(f, cld_f, cf);
+
+ f->do_oop(&_object);
+}