Re: [rvm-research] Writing information into Object Header's Misc field when object created

Rifat Shahriyar <[email protected]>
Newsgroups gmane.comp.java.jikes.rvm.devel
Message-ID <[email protected]>
Hi,
The attached patch (can be applied on the current tip) demonstrate how 
to read/write misc header when an object is created. It may help you.

Regards
-
Rifat
Australian National University


On 27/06/2014 1:30 am, Matthew Ma wrote:
> Hi,
> I want to write information into Object Header's Misc field when an 
> object is created: modify where RVM create new object (and its hearde)
>
> eg. From the user annotated program, I want to write group information 
> into the object header (ast and bst all refers to Tree object but each 
> would have different Group number written into the object header)
>
> 1 @create("Group1") //GroupInformation
> 2 public void foo(){
> 3ast = new Tree();
> 4 }
>
> 5 @create("Group2") ////GroupInformation
> 6 public void foo(){
> 7bst = new Tree();
> 8 }
>
> I looked into the option of changing the RVM to handle this mechanism 
> when object created, but from RVMClass, I could't find direct 
> connection to how to access MiscHeader class.
> In ObjectModel.java, I saw MiscHeader is invoked with 
> initializeHeader(..) at allocateScalar. is it where I can write 
> GroupInformation into the misc header field (by using RVMClass to get 
> current running RVMMethod, and use getAnnotation() to obtain the 
> annotated Group Information)?
>
> Thanks,
>
> Matthew
>
>
>
>
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
>
>
> _______________________________________________
> Jikesrvm-researchers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers

------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft

_______________________________________________
Jikesrvm-researchers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
mischeader.patch (text/plain, 4.8 KB)
diff -r 25e90303047f rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java
--- a/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java	Wed Jun 18 20:05:08 2014 +0200
+++ b/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java	Fri Jun 27 17:39:15 2014 +1000
@@ -487,6 +487,8 @@
     Address region = allocateSpace(mutator, size, align, offset, allocator, site);
     Object result = ObjectModel.initializeScalar(region, tib, size);
     mutator.postAlloc(ObjectReference.fromObject(result), ObjectReference.fromObject(tib), size, allocator);
+    ObjectModel.writeMisc(ObjectReference.fromObject(result), Word.one());
+    if (VM.VerifyAssertions) VM._assert(ObjectModel.readMisc(ObjectReference.fromObject(result)).EQ(Word.one()));
     return result;
   }
 
@@ -553,6 +555,8 @@
     Address region = allocateSpace(mutator, size, align, offset, allocator, site);
     Object result = ObjectModel.initializeArray(region, tib, numElements, size);
     mutator.postAlloc(ObjectReference.fromObject(result), ObjectReference.fromObject(tib), size, allocator);
+    ObjectModel.writeMisc(ObjectReference.fromObject(result), Word.one());
+    if (VM.VerifyAssertions) VM._assert(ObjectModel.readMisc(ObjectReference.fromObject(result)).EQ(Word.one()));
     return result;
   }
 
@@ -842,7 +846,9 @@
 
     Object result = ObjectModel.initializeArray(region, fakeTib, elements, size);
     mutator.postAlloc(ObjectReference.fromObject(result), ObjectReference.fromObject(fakeTib), size, type.getMMAllocator());
-
+    ObjectModel.writeMisc(ObjectReference.fromObject(result), Word.one());
+    if (VM.VerifyAssertions) VM._assert(ObjectModel.readMisc(ObjectReference.fromObject(result)).EQ(Word.one()));
+    
     /* Now we replace the TIB */
     ObjectModel.setTIB(result, realTib);
 
diff -r 25e90303047f rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java
--- a/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java	Wed Jun 18 20:05:08 2014 +0200
+++ b/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java	Fri Jun 27 17:39:15 2014 +1000
@@ -44,7 +44,7 @@
   /** Number of bytes used by the Java Header */
   int JAVA_HEADER_BYTES = TIB_BYTES + STATUS_BYTES;
   /** Number of bytes used by the GC Header */
-  int GC_HEADER_BYTES = MemoryManagerConstants.GC_HEADER_BYTES;
+  int GC_HEADER_BYTES = MemoryManagerConstants.GC_HEADER_BYTES + BYTES_IN_ADDRESS;
   /** Number of bytes used by the miscellaneous header */
   int MISC_HEADER_BYTES = MiscHeaderConstants.NUM_BYTES_HEADER;
   /** Size of GC and miscellaneous headers */
diff -r 25e90303047f rvm/src/org/jikesrvm/objectmodel/MiscHeader.java
--- a/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java	Wed Jun 18 20:05:08 2014 +0200
+++ b/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java	Fri Jun 27 17:39:15 2014 +1000
@@ -37,8 +37,9 @@
 
   private static final Offset MISC_HEADER_START = JavaHeaderConstants.MISC_HEADER_OFFSET;
 
+  static final Offset MY_MISC_OFFSET = MISC_HEADER_START;
   /* offset from object ref to .oid field, in bytes */
-  static final Offset OBJECT_OID_OFFSET = MISC_HEADER_START;
+  static final Offset OBJECT_OID_OFFSET = MY_MISC_OFFSET.plus(BYTES_IN_ADDRESS);
   /* offset from object ref to OBJECT_DEATH field, in bytes */
   static final Offset OBJECT_DEATH_OFFSET = OBJECT_OID_OFFSET.plus(BYTES_IN_ADDRESS);
   /* offset from object ref to .link field, in bytes */
@@ -212,4 +213,12 @@
       VM.sysWrite(" DEATH=", getDeathTime(ref));
     }
   }
+  
+  public static void writeMisc(ObjectReference object, Word value) {
+    Magic.setWordAtOffset(object, MY_MISC_OFFSET, value);
+  }
+  
+  public static Word readMisc(ObjectReference object) {
+    return Magic.getWordAtOffset(object, MY_MISC_OFFSET);
+  }
 }
diff -r 25e90303047f rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java
--- a/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java	Wed Jun 18 20:05:08 2014 +0200
+++ b/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java	Fri Jun 27 17:39:15 2014 +1000
@@ -36,5 +36,5 @@
   /**
    * How many bytes are used by all misc header fields?
    */
-  int NUM_BYTES_HEADER = GC_TRACING_HEADER_BYTES; // + YYY_HEADER_BYTES;
+  int NUM_BYTES_HEADER = GC_TRACING_HEADER_BYTES + BYTES_IN_ADDRESS; // + YYY_HEADER_BYTES;
 }
diff -r 25e90303047f rvm/src/org/jikesrvm/objectmodel/ObjectModel.java
--- a/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java	Wed Jun 18 20:05:08 2014 +0200
+++ b/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java	Fri Jun 27 17:39:15 2014 +1000
@@ -920,6 +920,14 @@
   public static void baselineEmitLoadTIB(Assembler asm, int dest, int object) {
     JavaHeader.baselineEmitLoadTIB(asm, dest, object);
   }
+  
+  public static void writeMisc(ObjectReference object, Word value) {
+    MiscHeader.writeMisc(object, value);
+  }
+  
+  public static Word readMisc(ObjectReference object) {
+    return MiscHeader.readMisc(object);
+  }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.