--- /dev/null 2016-10-25 08:46:44.038854975 +0200
+++ new/src/share/vm/evtrace/traceManager.hpp 2016-10-25 10:40:14.698781180 +0200
@@ -0,0 +1,107 @@
+/*
+ * 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 .
+ *
+ */
+
+#ifndef SHARE_VM_EVTRACE_TRACEMANAGER_HPP
+#define SHARE_VM_EVTRACE_TRACEMANAGER_HPP
+
+#include "runtime/handles.hpp"
+#include "utilities/exceptions.hpp"
+
+class TraceBuffer;
+class TraceBufferQueue;
+class TraceReaderThread;
+class TraceMetadata;
+class Monitor;
+
+class TraceStatistics {
+public:
+ virtual ~TraceStatistics() {}
+
+ virtual void add_entry(const char* name, jdouble value) = 0;
+};
+
+class TraceManager {
+private:
+ static void assert_initialized();
+
+ static volatile bool _is_initialized;
+ static TraceReaderThread *_thread;
+ static volatile bool _thread_running;
+ static Monitor *_thread_mtx;
+ static TraceBufferQueue *_free_queue;
+ static TraceBufferQueue *_flush_queue;
+ static TraceMetadata *_metadata;
+ static bool _classes_unloaded_in_current_safepoint;
+ DEBUG_ONLY(static int _current_safepoint_counter);
+
+ // statistics
+ static volatile intptr_t _buffer_count, _max_buffer_count, _allocated_buffer_count;
+ static volatile intptr_t _submitted_trace_bytes;
+ static intptr_t _reclaimed_trace_bytes;
+ static volatile intptr_t _reclaim_time_nanos;
+ static intptr_t _stored_free_dequeue_ops, _stored_free_enqueue_ops;
+ static intptr_t _stored_flush_dequeue_ops, _stored_flush_enqueue_ops;
+ static volatile intptr_t _total_stack_traces, _truncated_stack_traces, _reused_memento_stack_traces, _total_stack_frames, _reused_memento_stack_frames;
+
+ static Handle create_queue_object(TraceBufferQueue *q, instanceKlassHandle klass, TRAPS);
+
+ static jlong do_reclaim_buffers_in_safepoint(bool deinit);
+ static void pre_submit_buffer(TraceBuffer *buffer);
+
+ static TraceBuffer *allocate_buffer();
+
+public:
+ class VM_ReclaimTraceBuffers;
+ class VM_ResetTraceMetadata;
+ class ReclaimTraceBuffersClosure;
+
+ static void initialize();
+ static bool is_initialized();
+ static void start_threads(TRAPS);
+ static void reclaim_buffers_in_safepoint(bool wait_until_processed);
+ static void finish_and_destroy(TRAPS);
+
+ static TraceBuffer * request_buffer();
+ static void submit_buffer(TraceBuffer *buffer);
+ static void free_buffer(TraceBuffer *buffer);
+
+ static TraceMetadata * metadata();
+ static void reset_metadata();
+
+ static void do_work_before_safepoint_end();
+
+ static void nmethod_is_unloading(const nmethod *nm);
+ static void class_loader_is_unloading(ClassLoaderData *loader);
+
+ static void thread_is_exiting(TraceReaderThread *t);
+
+ // statistics
+ static void write_stats(TraceStatistics *stats);
+ static void reset_stats();
+ static void update_stack_trace_stats(bool truncated, intptr_t total_frames, intptr_t memento_frames);
+};
+
+#include "evtrace/traceManager.inline.hpp"
+
+#endif /* SHARE_VM_EVTRACE_TRACEMANAGER_HPP */