1 /* 2 * Copyright (c) 2001, 2020, 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 import sun.jvm.hotspot.utilities.Observable; 33 import sun.jvm.hotspot.utilities.Observer; 34 35 public class ObjectMonitor extends VMObject { 36 static { 37 VM.registerVMInitializedObserver(new Observer() { 38 public void update(Observable o, Object data) { 39 initialize(VM.getVM().getTypeDataBase()); 40 } 41 }); 42 } 43 44 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { 45 heap = VM.getVM().getObjectHeap(); 46 Type type = db.lookupType("ObjectMonitor"); 47 sun.jvm.hotspot.types.Field f = type.getField("_header"); 48 headerFieldOffset = f.getOffset(); 49 f = type.getField("_object"); 50 objectFieldOffset = f.getOffset(); 51 f = type.getField("_owner"); 52 ownerFieldOffset = f.getOffset(); 53 f = type.getField("_next_om"); 54 nextOMFieldOffset = f.getOffset(); 55 contentionsField = type.getJIntField("_contentions"); 56 waitersField = type.getJIntField("_waiters"); 57 recursionsField = type.getCIntegerField("_recursions"); 58 59 ANONYMOUS_OWNER = db.lookupLongConstant("ObjectMonitor::ANONYMOUS_OWNER").longValue(); 60 } 61 62 public ObjectMonitor(Address addr) { 63 super(addr); 64 } 65 66 public Mark header() { 67 return new Mark(addr.addOffsetTo(headerFieldOffset)); 68 } 69 70 // FIXME 71 // void set_header(markWord hdr); 72 73 // FIXME: must implement and delegate to platform-dependent implementation 74 // public boolean isBusy(); 75 public boolean isEntered(sun.jvm.hotspot.runtime.Thread current) { 76 Address o = owner(); 77 if (current.threadObjectAddress().equals(o) || 78 current.isLockOwned(o)) { 79 return true; 80 } 81 return false; 82 } 83 84 public boolean isOwnedAnonymous() { 85 return addr.getAddressAt(ownerFieldOffset).asLongValue() == ANONYMOUS_OWNER; 86 } 87 88 public Address owner() { return addr.getAddressAt(ownerFieldOffset); } 89 // FIXME 90 // void set_owner(void* owner); 91 92 public int waiters() { return waitersField.getValue(addr); } 93 94 public Address nextOM() { return addr.getAddressAt(nextOMFieldOffset); } 95 // FIXME 96 // void set_queue(void* owner); 97 98 public long recursions() { return recursionsField.getValue(addr); } 99 100 public OopHandle object() { 101 Address objAddr = addr.getAddressAt(objectFieldOffset); 102 if (objAddr == null) { 103 return null; 104 } 105 return objAddr.getOopHandleAt(0); 106 } 107 108 public int contentions() { 109 return contentionsField.getValue(addr); 110 } 111 112 // The following four either aren't expressed as typed fields in 113 // vmStructs.cpp because they aren't strongly typed in the VM, or 114 // would confuse the SA's type system. 115 private static ObjectHeap heap; 116 private static long headerFieldOffset; 117 private static long objectFieldOffset; 118 private static long ownerFieldOffset; 119 private static long nextOMFieldOffset; 120 private static JIntField contentionsField; 121 private static JIntField waitersField; 122 private static CIntegerField recursionsField; 123 private static long ANONYMOUS_OWNER; 124 125 // FIXME: expose platform-dependent stuff 126 }