--- old/agent/src/share/classes/sun/jvm/hotspot/oops/Mark.java	Thu May 29 11:13:53 2008
+++ new/agent/src/share/classes/sun/jvm/hotspot/oops/Mark.java	Thu May 29 11:13:52 2008
@@ -79,6 +79,18 @@
     noHashInPlace       = db.lookupLongConstant("markOopDesc::no_hash_in_place").longValue();
     noLockInPlace       = db.lookupLongConstant("markOopDesc::no_lock_in_place").longValue();
     maxAge              = db.lookupLongConstant("markOopDesc::max_age").longValue();
+
+    /* Constants in markOop used by CMS. */
+    cmsBits             = db.lookupLongConstant("markOopDesc::cms_bits").longValue();
+    cmsShift            = db.lookupLongConstant("markOopDesc::cms_shift").longValue();
+    cmsMask             = db.lookupLongConstant("markOopDesc::cms_mask").longValue();
+    cmsMaskInPlace      = db.lookupLongConstant("markOopDesc::cms_mask_in_place").longValue();
+    cmsFreeChunkPattern = db.lookupLongConstant("markOopDesc::cms_free_chunk_pattern").longValue();
+    cmsNoCoalescePattern= db.lookupLongConstant("markOopDesc::cms_no_coalesce_pattern").longValue();
+    sizeShift           = db.lookupLongConstant("markOopDesc::size_shift").longValue();
+    sizeBits            = db.lookupLongConstant("markOopDesc::size_bits").longValue();
+    sizeMask            = db.lookupLongConstant("markOopDesc::size_mask").longValue();
+    sizeMaskInPlace     = db.lookupLongConstant("markOopDesc::size_mask_in_place").longValue();
   }
 
   // Field accessors
@@ -120,6 +132,18 @@
 
   private static long maxAge;
 
+  /* Constants in markOop used by CMS. */
+  private static long cmsBits;
+  private static long cmsShift;
+  private static long cmsMask;
+  private static long cmsMaskInPlace;
+  private static long cmsFreeChunkPattern;
+  private static long cmsNoCoalescePattern;
+  private static long sizeShift;
+  private static long sizeBits;
+  private static long sizeMask;
+  private static long sizeMaskInPlace;
+
   public Mark(Address addr) {
     super(addr);
   }
@@ -290,4 +314,14 @@
   //
   //  // Recover address of oop from encoded form used in mark
   //  inline void* decode_pointer() { return clear_lock_bits(); }
+
+  // Copy markOop methods for CMS here.
+  private long cmsEncoding() {
+    return Bits.maskBitsLong(value() >> cmsShift, cmsMask);
+  }
+  public boolean isCmsFreeChunk() {
+    return isUnlocked() && 
+           (cmsEncoding() & cmsFreeChunkPattern) == cmsFreeChunkPattern;
+  }
+  public long getSize() { return (long)(value() >> sizeShift); }
 }
