--- /dev/null 2016-10-25 08:46:44.038854975 +0200 +++ new/src/share/classes/sun/evtracing/parser/TraceParser.java 2016-10-25 10:40:40.338798151 +0200 @@ -0,0 +1,183 @@ +/* + * 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 . + * + */ +package sun.evtracing.parser; + +import java.util.Map; + +import sun.evtracing.StatisticsProvider; +import sun.evtracing.TraceBuffer; +import sun.evtracing.processing.ProgressCallback; +import sun.evtracing.processing.TraceEventHandler; +import sun.evtracing.processing.TraceProcessor; + +public class TraceParser implements TraceProcessor, StatisticsProvider { + + private final TraceEventHandler handler; + private final ProgressCallback progressCallback; + private boolean initialized; + private long bytesProcessed; + + public TraceParser(TraceEventHandler handler, ProgressCallback callback) { + this.handler = handler; + this.progressCallback = callback; + initialized = true; + } + + @Override + public void process(TraceBuffer buffer) { + TraceReader reader = new TraceReader(buffer.bytes()); + final long thread = buffer.thread(); + while (reader.hasMore()) { + assert initialized; + byte t = reader.peekByte(); + switch (TraceEventType.fromOrdinal(t)) { + case ThreadStart: + handler.threadStart(ThreadStartEvent.parse(reader, thread)); + break; + + case ThreadNameChange: + handler.threadNameChange(ThreadNameChangeEvent.parse(reader, thread)); + break; + + case ThreadStateChange: + handler.threadStateChange(ThreadStateChangeEvent.parse(reader, thread)); + break; + + case ThreadInterrupt: + handler.threadInterrupt(ThreadInterruptEvent.parse(reader, thread)); + break; + + case ThreadExit: + handler.threadExit(ThreadExitEvent.parse(reader, thread)); + break; + + case ThreadParkBegin: + handler.threadParkBegin(ThreadParkBeginEvent.parse(reader, thread)); + break; + + case ThreadParkEnd: + handler.threadParkEnd(ThreadParkEndEvent.parse(reader, thread)); + break; + + case ThreadUnpark: + handler.threadUnpark(ThreadUnparkEvent.parse(reader, thread)); + break; + + case MonitorInflate: + handler.monitorInflate(MonitorInflateEvent.parse(reader, thread)); + break; + + case MonitorDeflate: + handler.monitorDeflate(MonitorDeflateEvent.parse(reader, thread)); + break; + + case MonitorContendedEnter: + handler.monitorContendedEnter(MonitorContendedEnterEvent.parse(reader, thread)); + break; + + case MonitorContendedEntered: + handler.monitorContendedEntered(MonitorContendedEnteredEvent.parse(reader, thread)); + break; + + case MonitorContendedExited: + handler.monitorContendedExited(MonitorContendedExitedEvent.parse(reader, thread)); + break; + + case MonitorDummy: + handler.monitorDummy(MonitorDummyEvent.parse(reader, thread)); + break; + + case ClassMetadata: + handler.classMetadata(ClassMetadataEvent.parse(reader, thread)); + break; + + case MethodMetadata: + handler.methodMetadata(MethodMetadataEvent.parse(reader, thread)); + break; + + case StackMetadata: + handler.stackMetadata(StackMetadataEvent.parse(reader, thread)); + break; + + case IdenticalStacksMetadata: + handler.identicalStacksMetadata(IdenticalStacksMetadataEvent.parse(reader, thread)); + break; + + case ClassLoaderUnload: + handler.classLoaderUnload(ClassLoaderUnloadEvent.parse(reader, thread)); + break; + + case SafepointBegin: + handler.safepointBegin(SafepointBeginEvent.parse(reader, thread)); + break; + + case SafepointEnd: + handler.safepointEnd(SafepointEndEvent.parse(reader, thread)); + break; + + case VMEnd: + initialized = false; + handler.endVM(VMEndEvent.parse(reader, thread)); + break; + + case MetadataReset: + handler.metadataReset(MetadataResetEvent.parse(reader, thread)); + break; + + case Group: + handler.group(GroupEvent.parse(reader, thread)); + break; + + case Marker: + handler.marker(MarkerEvent.parse(reader, thread)); + break; + + default: + throw new RuntimeException("unknown"); + } + if (progressCallback != null) { + progressCallback.eventRead(); + } + } + bytesProcessed += reader.bytesRead(); + } + + @Override + public void putStatistics(Map map) { + map.put("processed_trace_bytes", (double) bytesProcessed); + handler.putStatistics(map); + } + + @Override + public void resetStatistics() { + bytesProcessed = 0; + handler.resetStatistics(); + } + + @Override + public void close() { + assert !initialized; + } + +}