< prev index next >

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Mark.java

Print this page

 34 import sun.jvm.hotspot.utilities.Observable;
 35 import sun.jvm.hotspot.utilities.Observer;
 36 
 37 public class Mark extends VMObject {
 38   static {
 39     VM.registerVMInitializedObserver(new Observer() {
 40         public void update(Observable o, Object data) {
 41           initialize(VM.getVM().getTypeDataBase());
 42         }
 43       });
 44   }
 45 
 46   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
 47     Type type  = db.lookupType("oopDesc");
 48     markField  = type.getCIntegerField("_mark");
 49 
 50     ageBits             = db.lookupLongConstant("markWord::age_bits").longValue();
 51     lockBits            = db.lookupLongConstant("markWord::lock_bits").longValue();
 52     maxHashBits         = db.lookupLongConstant("markWord::max_hash_bits").longValue();
 53     hashBits            = db.lookupLongConstant("markWord::hash_bits").longValue();

 54     lockShift           = db.lookupLongConstant("markWord::lock_shift").longValue();
 55     ageShift            = db.lookupLongConstant("markWord::age_shift").longValue();
 56     hashShift           = db.lookupLongConstant("markWord::hash_shift").longValue();

 57     if (VM.getVM().isLP64()) {
 58       klassShift          = db.lookupLongConstant("markWord::klass_shift").longValue();
 59     }
 60     lockMask            = db.lookupLongConstant("markWord::lock_mask").longValue();
 61     lockMaskInPlace     = db.lookupLongConstant("markWord::lock_mask_in_place").longValue();
 62     ageMask             = db.lookupLongConstant("markWord::age_mask").longValue();
 63     ageMaskInPlace      = db.lookupLongConstant("markWord::age_mask_in_place").longValue();
 64     hashMask            = db.lookupLongConstant("markWord::hash_mask").longValue();
 65     hashMaskInPlace     = db.lookupLongConstant("markWord::hash_mask_in_place").longValue();




 66     lockedValue         = db.lookupLongConstant("markWord::locked_value").longValue();
 67     unlockedValue       = db.lookupLongConstant("markWord::unlocked_value").longValue();
 68     monitorValue        = db.lookupLongConstant("markWord::monitor_value").longValue();
 69     markedValue         = db.lookupLongConstant("markWord::marked_value").longValue();
 70     noHash              = db.lookupLongConstant("markWord::no_hash").longValue();
 71     noHashInPlace       = db.lookupLongConstant("markWord::no_hash_in_place").longValue();
 72     noLockInPlace       = db.lookupLongConstant("markWord::no_lock_in_place").longValue();
 73     maxAge              = db.lookupLongConstant("markWord::max_age").longValue();
 74   }
 75 
 76   // Field accessors
 77   private static CIntegerField markField;
 78 
 79   // Constants -- read from VM
 80   private static long ageBits;
 81   private static long lockBits;
 82   private static long maxHashBits;
 83   private static long hashBits;

 84 
 85   private static long lockShift;
 86   private static long ageShift;
 87   private static long hashShift;

 88   private static long klassShift;
 89 
 90   private static long lockMask;
 91   private static long lockMaskInPlace;
 92   private static long ageMask;
 93   private static long ageMaskInPlace;
 94   private static long hashMask;
 95   private static long hashMaskInPlace;




 96 
 97   private static long lockedValue;
 98   private static long unlockedValue;
 99   private static long monitorValue;
100   private static long markedValue;
101 
102   private static long noHash;
103 
104   private static long noHashInPlace;
105   private static long noLockInPlace;
106 
107   private static long maxAge;
108 
109   public static long getKlassShift() {
110     return klassShift;
111   }
112 
113   public Mark(Address addr) {
114     super(addr);
115   }

169       return null;
170     }
171     // Use xor instead of &~ to provide one extra tag-bit check.
172     Address monAddr = valueAsAddress().xorWithMask(monitorValue);
173     return new ObjectMonitor(monAddr);
174   }
175   public boolean hasDisplacedMarkHelper() {
176     return ((value() & unlockedValue) == 0);
177   }
178   public Mark displacedMarkHelper() {
179     if (Assert.ASSERTS_ENABLED) {
180       Assert.that(hasDisplacedMarkHelper(), "check");
181     }
182     Address addr = valueAsAddress().andWithMask(~monitorValue);
183     return new Mark(addr.getAddressAt(0));
184   }
185   public int age() { return (int) Bits.maskBitsLong(value() >> ageShift, ageMask); }
186 
187   // hash operations
188   public long hash() {
189     return Bits.maskBitsLong(value() >> hashShift, hashMask);





190   }
191 
192   public boolean hasNoHash() {
193     return hash() == noHash;
194   }
195 





196   public Klass getKlass() {
197     assert(VM.getVM().isCompactObjectHeadersEnabled());
198     return (Klass)Metadata.instantiateWrapperFor(addr.getCompKlassAddressAt(0));
199   }
200 
201   // Debugging
202   public void printOn(PrintStream tty) {
203     if (isLocked()) {
204       tty.print("locked(0x" +
205                 Long.toHexString(value()) + ")->");
206       displacedMarkHelper().printOn(tty);
207     } else {
208       if (Assert.ASSERTS_ENABLED) {
209         Assert.that(isUnlocked(), "just checking");
210       }
211       tty.print("mark(");
212       tty.print("hash " + Long.toHexString(hash()) + ",");
213       tty.print("age " + age() + ")");
214     }
215   }

 34 import sun.jvm.hotspot.utilities.Observable;
 35 import sun.jvm.hotspot.utilities.Observer;
 36 
 37 public class Mark extends VMObject {
 38   static {
 39     VM.registerVMInitializedObserver(new Observer() {
 40         public void update(Observable o, Object data) {
 41           initialize(VM.getVM().getTypeDataBase());
 42         }
 43       });
 44   }
 45 
 46   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
 47     Type type  = db.lookupType("oopDesc");
 48     markField  = type.getCIntegerField("_mark");
 49 
 50     ageBits             = db.lookupLongConstant("markWord::age_bits").longValue();
 51     lockBits            = db.lookupLongConstant("markWord::lock_bits").longValue();
 52     maxHashBits         = db.lookupLongConstant("markWord::max_hash_bits").longValue();
 53     hashBits            = db.lookupLongConstant("markWord::hash_bits").longValue();
 54     hashCtrlBits        = db.lookupLongConstant("markWord::hashctrl_bits").longValue();
 55     lockShift           = db.lookupLongConstant("markWord::lock_shift").longValue();
 56     ageShift            = db.lookupLongConstant("markWord::age_shift").longValue();
 57     hashShift           = db.lookupLongConstant("markWord::hash_shift").longValue();
 58     hashCtrlShift       = db.lookupLongConstant("markWord::hashctrl_shift").longValue();
 59     if (VM.getVM().isLP64()) {
 60       klassShift          = db.lookupLongConstant("markWord::klass_shift").longValue();
 61     }
 62     lockMask            = db.lookupLongConstant("markWord::lock_mask").longValue();
 63     lockMaskInPlace     = db.lookupLongConstant("markWord::lock_mask_in_place").longValue();
 64     ageMask             = db.lookupLongConstant("markWord::age_mask").longValue();
 65     ageMaskInPlace      = db.lookupLongConstant("markWord::age_mask_in_place").longValue();
 66     hashMask            = db.lookupLongConstant("markWord::hash_mask").longValue();
 67     hashMaskInPlace     = db.lookupLongConstant("markWord::hash_mask_in_place").longValue();
 68     hashCtrlMask        = db.lookupLongConstant("markWord::hashctrl_mask").longValue();
 69     hashCtrlMaskInPlace = db.lookupLongConstant("markWord::hashctrl_mask_in_place").longValue();
 70     hashCtrlHashedMaskInPlace =   db.lookupLongConstant("markWord::hashctrl_hashed_mask_in_place").longValue();
 71     hashCtrlExpandedMaskInPlace = db.lookupLongConstant("markWord::hashctrl_expanded_mask_in_place").longValue();
 72     lockedValue         = db.lookupLongConstant("markWord::locked_value").longValue();
 73     unlockedValue       = db.lookupLongConstant("markWord::unlocked_value").longValue();
 74     monitorValue        = db.lookupLongConstant("markWord::monitor_value").longValue();
 75     markedValue         = db.lookupLongConstant("markWord::marked_value").longValue();
 76     noHash              = db.lookupLongConstant("markWord::no_hash").longValue();
 77     noHashInPlace       = db.lookupLongConstant("markWord::no_hash_in_place").longValue();
 78     noLockInPlace       = db.lookupLongConstant("markWord::no_lock_in_place").longValue();
 79     maxAge              = db.lookupLongConstant("markWord::max_age").longValue();
 80   }
 81 
 82   // Field accessors
 83   private static CIntegerField markField;
 84 
 85   // Constants -- read from VM
 86   private static long ageBits;
 87   private static long lockBits;
 88   private static long maxHashBits;
 89   private static long hashBits;
 90   private static long hashCtrlBits;
 91 
 92   private static long lockShift;
 93   private static long ageShift;
 94   private static long hashShift;
 95   private static long hashCtrlShift;
 96   private static long klassShift;
 97 
 98   private static long lockMask;
 99   private static long lockMaskInPlace;
100   private static long ageMask;
101   private static long ageMaskInPlace;
102   private static long hashMask;
103   private static long hashMaskInPlace;
104   private static long hashCtrlMask;
105   private static long hashCtrlMaskInPlace;
106   private static long hashCtrlHashedMaskInPlace;
107   private static long hashCtrlExpandedMaskInPlace;
108 
109   private static long lockedValue;
110   private static long unlockedValue;
111   private static long monitorValue;
112   private static long markedValue;
113 
114   private static long noHash;
115 
116   private static long noHashInPlace;
117   private static long noLockInPlace;
118 
119   private static long maxAge;
120 
121   public static long getKlassShift() {
122     return klassShift;
123   }
124 
125   public Mark(Address addr) {
126     super(addr);
127   }

181       return null;
182     }
183     // Use xor instead of &~ to provide one extra tag-bit check.
184     Address monAddr = valueAsAddress().xorWithMask(monitorValue);
185     return new ObjectMonitor(monAddr);
186   }
187   public boolean hasDisplacedMarkHelper() {
188     return ((value() & unlockedValue) == 0);
189   }
190   public Mark displacedMarkHelper() {
191     if (Assert.ASSERTS_ENABLED) {
192       Assert.that(hasDisplacedMarkHelper(), "check");
193     }
194     Address addr = valueAsAddress().andWithMask(~monitorValue);
195     return new Mark(addr.getAddressAt(0));
196   }
197   public int age() { return (int) Bits.maskBitsLong(value() >> ageShift, ageMask); }
198 
199   // hash operations
200   public long hash() {
201     if (VM.getVM().isCompactObjectHeadersEnabled()) {
202       System.exit(-23);
203       throw new RuntimeException("Compact I-Hash not yet implemented");
204     } else {
205       return Bits.maskBitsLong(value() >> hashShift, hashMask);
206     }
207   }
208 
209   public boolean hasNoHash() {
210     return hash() == noHash;
211   }
212 
213   public boolean isExpanded() {
214     assert(VM.getVM().isCompactObjectHeadersEnabled());
215     return Bits.maskBitsLong(value(), hashCtrlExpandedMaskInPlace) != 0;
216   }
217 
218   public Klass getKlass() {
219     assert(VM.getVM().isCompactObjectHeadersEnabled());
220     return (Klass)Metadata.instantiateWrapperFor(addr.getCompKlassAddressAt(0));
221   }
222 
223   // Debugging
224   public void printOn(PrintStream tty) {
225     if (isLocked()) {
226       tty.print("locked(0x" +
227                 Long.toHexString(value()) + ")->");
228       displacedMarkHelper().printOn(tty);
229     } else {
230       if (Assert.ASSERTS_ENABLED) {
231         Assert.that(isUnlocked(), "just checking");
232       }
233       tty.print("mark(");
234       tty.print("hash " + Long.toHexString(hash()) + ",");
235       tty.print("age " + age() + ")");
236     }
237   }
< prev index next >