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