1 /* 2 * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.tools.jdi; 27 28 import com.sun.jdi.*; 29 30 public class MonitorInfoImpl extends MirrorImpl 31 implements MonitorInfo, ThreadListener { 32 33 /* Once false, monitorInfo should not be used. 34 * access synchronized on (vm.state()) 35 */ 36 private boolean isValid = true; 37 38 ObjectReference monitor; 39 ThreadReference thread; 40 int stack_depth; 41 MonitorInfoImpl(VirtualMachine vm, ObjectReference mon, ThreadReferenceImpl thread, int dpth)42 MonitorInfoImpl(VirtualMachine vm, ObjectReference mon, 43 ThreadReferenceImpl thread, int dpth) { 44 super(vm); 45 this.monitor = mon; 46 this.thread = thread; 47 this.stack_depth = dpth; 48 thread.addListener(this); 49 } 50 51 52 /* 53 * ThreadListener implementation 54 * Must be synchronized since we must protect against 55 * sending defunct (isValid == false) stack ids to the back-end. 56 */ threadResumable(ThreadAction action)57 public boolean threadResumable(ThreadAction action) { 58 synchronized (vm.state()) { 59 if (isValid) { 60 isValid = false; 61 return false; /* remove this stack frame as a listener */ 62 } else { 63 throw new InternalException( 64 "Invalid stack frame thread listener"); 65 } 66 } 67 } 68 validateMonitorInfo()69 private void validateMonitorInfo() { 70 if (!isValid) { 71 throw new InvalidStackFrameException("Thread has been resumed"); 72 } 73 } 74 monitor()75 public ObjectReference monitor() { 76 validateMonitorInfo(); 77 return monitor; 78 } 79 stackDepth()80 public int stackDepth() { 81 validateMonitorInfo(); 82 return stack_depth; 83 } 84 thread()85 public ThreadReference thread() { 86 validateMonitorInfo(); 87 return thread; 88 } 89 } 90