1 /* 2 * Copyright (c) 2001, 2014, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 package sun.jvm.hotspot.runtime; 26 27 import java.util.*; 28 29 import sun.jvm.hotspot.debugger.*; 30 import sun.jvm.hotspot.oops.*; 31 import sun.jvm.hotspot.types.*; 32 33 public class ObjectMonitor extends VMObject { 34 static { 35 VM.registerVMInitializedObserver(new Observer() { 36 public void update(Observable o, Object data) { 37 initialize(VM.getVM().getTypeDataBase()); 38 } 39 }); 40 } 41 42 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { 43 heap = VM.getVM().getObjectHeap(); 44 Type type = db.lookupType("ObjectMonitor"); 45 sun.jvm.hotspot.types.Field f = type.getField("_header"); 46 headerFieldOffset = f.getOffset(); 47 f = type.getField("_object"); 48 objectFieldOffset = f.getOffset(); 49 f = type.getField("_owner"); 50 ownerFieldOffset = f.getOffset(); 51 f = type.getField("FreeNext"); 52 FreeNextFieldOffset = f.getOffset(); 53 countField = type.getJIntField("_count"); 54 waitersField = type.getJIntField("_waiters"); 55 recursionsField = type.getCIntegerField("_recursions"); 56 } 57 58 public ObjectMonitor(Address addr) { 59 super(addr); 60 } 61 62 public Mark header() { 63 return new Mark(addr.addOffsetTo(headerFieldOffset)); 64 } 65 66 // FIXME 67 // void set_header(markOop hdr); 68 69 // FIXME: must implement and delegate to platform-dependent implementation 70 // public boolean isBusy(); 71 public boolean isEntered(sun.jvm.hotspot.runtime.Thread current) { 72 Address o = owner(); 73 if (current.threadObjectAddress().equals(o) || 74 current.isLockOwned(o)) { 75 return true; 76 } 77 return false; 78 } 79 80 public Address owner() { return addr.getAddressAt(ownerFieldOffset); } 81 // FIXME 82 // void set_owner(void* owner); 83 84 public int waiters() { return waitersField.getValue(addr); } 85 86 public Address freeNext() { return addr.getAddressAt(FreeNextFieldOffset); } 87 // FIXME 88 // void set_queue(void* owner); 89 90 public int count() { return countField.getValue(addr); } 91 // FIXME 92 // void set_count(int count); 93 94 public long recursions() { return recursionsField.getValue(addr); } 95 96 public OopHandle object() { 97 return addr.getOopHandleAt(objectFieldOffset); 98 } 99 100 // contentions is always equal to count 101 public int contentions() { 102 return count(); 103 } 104 105 // FIXME 106 // void* object_addr(); 107 // void set_object(void* obj); 108 109 // The following four either aren't expressed as typed fields in 110 // vmStructs.cpp because they aren't strongly typed in the VM, or 111 // would confuse the SA's type system. 112 private static ObjectHeap heap; 113 private static long headerFieldOffset; 114 private static long objectFieldOffset; 115 private static long ownerFieldOffset; 116 private static long FreeNextFieldOffset; 117 private static JIntField countField; 118 private static JIntField waitersField; 119 private static CIntegerField recursionsField; 120 // FIXME: expose platform-dependent stuff 121 }