1 /* 2 * Copyright (c) 2014, 2015, Dynatrace and/or its affiliates. All rights reserved. 3 * 4 * This file is part of the Lock Contention Tracing Subsystem for the HotSpot 5 * Virtual Machine, which is developed at Christian Doppler Laboratory on 6 * Monitoring and Evolution of Very-Large-Scale Software Systems. Please 7 * contact us at <http://mevss.jku.at/> if you need additional information 8 * or have any questions. 9 * 10 * This code is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License version 2 only, as 12 * published by the Free Software Foundation. 13 * 14 * This code is distributed in the hope that it will be useful, but WITHOUT 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 * version 2 for more details (a copy is included in the LICENSE file that 18 * accompanied this code). 19 * 20 * You should have received a copy of the GNU General Public License version 21 * 2 along with this work. If not, see <http://www.gnu.org/licenses/>. 22 * 23 */ 24 package sun.evtracing.processing.statistics; 25 26 import java.util.HashMap; 27 import java.util.Map; 28 29 import sun.evtracing.parser.MonitorContendedEnterEvent; 30 import sun.evtracing.parser.MonitorContendedEnteredEvent; 31 import sun.evtracing.parser.MonitorContendedExitedEvent; 32 import sun.evtracing.parser.MonitorDeflateEvent; 33 import sun.evtracing.parser.MonitorInflateEvent; 34 import sun.evtracing.parser.metadata.JavaThread; 35 import sun.evtracing.processing.statistics.aggregator.ContentionProcessor; 36 import sun.evtracing.processing.statistics.metadata.JavaObject; 37 import sun.evtracing.processing.statistics.metadata.JavaObjectStack; 38 import sun.evtracing.processing.statistics.metadata.JavaImmutableSingleObjectStack; 39 40 public class MonitorAnalyser { 41 42 private final JavaObjectStack objectStack; 43 private final ContentionProcessor processor; 44 private final Map<JavaThread, MonitorContender> contenders = new HashMap<>(); 45 46 private MonitorAnalyser(JavaObjectStack object, ContentionProcessor processor) { 47 this.objectStack = object; 48 this.processor = processor; 49 } 50 51 public void enter(MonitorContendedEnterEvent event) { 52 assert !contenders.containsKey(event.thread().metadata()); 53 contenders.put(event.thread().metadata(), MonitorContender.forEnter(objectStack, event, processor)); 54 } 55 56 public void entered(MonitorContendedEnteredEvent event) { 57 MonitorContender owner = contenders.remove(event.thread().metadata()); 58 owner.monitorContendedEntered(event); 59 } 60 61 public void exited(MonitorContendedExitedEvent event) { 62 contenders.values().forEach(c -> c.contenderExitedMonitor(event)); 63 } 64 65 public void deflate(MonitorDeflateEvent event) { 66 assert contenders.isEmpty(); 67 } 68 69 public static MonitorAnalyser forInflate(MonitorInflateEvent event, ContentionProcessor processor) { 70 JavaObject obj = JavaObject.get(event.object(), event.clazz().metadata()); 71 return new MonitorAnalyser(new JavaImmutableSingleObjectStack(obj), processor); 72 } 73 74 }