[vmkit-commits] [vmkit] r180280 - add accessor for gcRoot header

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 09:48:22 PDT 2013


Author: peter.senna
Date: Thu Apr 25 11:46:49 2013
New Revision: 180280

URL: http://llvm.org/viewvc/llvm-project?rev=180280&view=rev
Log:
add accessor for gcRoot header
(cherry picked from commit b4d4a7c45919332b2be62f9affae4a6127d00623)

Modified:
    vmkit/trunk/include/vmkit/GC.h
    vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
    vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp

Modified: vmkit/trunk/include/vmkit/GC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/GC.h?rev=180280&r1=180279&r2=180280&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/GC.h (original)
+++ vmkit/trunk/include/vmkit/GC.h Thu Apr 25 11:46:49 2013
@@ -15,13 +15,28 @@
 #include "vmkit/System.h"
 
 class VirtualTable;
+class gc;
+
+class gcHeader {
+public:
+	word_t _header;
+
+	inline gc* toReference() { return (gc*)((uintptr_t)this + hiddenHeaderSize()); }
+
+	static inline size_t hiddenHeaderSize() { return sizeof(gcHeader); }
+};
 
 class gcRoot {
+	private:
+		word_t _header;
 public:
   virtual           ~gcRoot() {}
   virtual void      tracer(word_t closure) {}
-  word_t header;
+
+  word_t& header(){return _header; }
   
+  inline gcHeader* toHeader() { return (gcHeader*)((uintptr_t)this - gcHeader::hiddenHeaderSize()); }
+
   /// getVirtualTable - Returns the virtual table of this object.
   ///
   VirtualTable* getVirtualTable() const {

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.cpp?rev=180280&r1=180279&r2=180280&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.cpp Thu Apr 25 11:46:49 2013
@@ -34,7 +34,7 @@ uint32_t JavaObject::hashCode(JavaObject
   assert(HashMask != 0);
   assert(vmkit::HashBits != 0);
 
-  word_t header = self->header;
+  word_t header = self->header();
   word_t GCBits;
   GCBits = header & vmkit::GCBitMask;
   word_t val = header & HashMask;
@@ -54,16 +54,16 @@ uint32_t JavaObject::hashCode(JavaObject
   assert(val <= HashMask);
 
   do {
-    header = self->header;
+    header = self->header();
     if ((header & HashMask) != 0) break;
     word_t newHeader = header | val;
     assert((newHeader & ~HashMask) == header);
-    __sync_val_compare_and_swap(&(self->header), header, newHeader);
+    __sync_val_compare_and_swap(&(self->header()), header, newHeader);
   } while (true);
 
-  assert((self->header & HashMask) != 0);
-  assert(GCBits == (self->header & vmkit::GCBitMask));
-  return (self->header & HashMask) ^ (word_t)getClass(self);
+  assert((self->header() & HashMask) != 0);
+  assert(GCBits == (self->header() & vmkit::GCBitMask));
+  return (self->header() & HashMask) ^ (word_t)getClass(self);
 }
 
 

Modified: vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=180280&r1=180279&r2=180280&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Apr 25 11:46:49 2013
@@ -32,11 +32,11 @@ void ThinLock::overflowThinLock(gc* obje
   word_t newValue = 0;
   word_t yieldedValue = 0;
   do {
-    oldValue = object->header;
+    oldValue = object->header();
     newValue = obj->getID() | (oldValue & NonLockBitsMask);
     assert(obj->associatedObject == object);
-    yieldedValue = __sync_val_compare_and_swap(&(object->header), oldValue, newValue);
-  } while (((object->header) & ~NonLockBitsMask) != ID);
+    yieldedValue = __sync_val_compare_and_swap(&(object->header()), oldValue, newValue);
+  } while (((object->header()) & ~NonLockBitsMask) != ID);
   assert(obj->associatedObject == object);
 }
  
@@ -53,9 +53,9 @@ void ThinLock::removeFatLock(FatLock* fa
 
   ID = fatLock->getID();
   do {
-    oldValue = object->header;
+    oldValue = object->header();
     newValue = oldValue & NonLockBitsMask;
-    yieldedValue = __sync_val_compare_and_swap(&object->header, oldValue, newValue);
+    yieldedValue = __sync_val_compare_and_swap(&object->header(), oldValue, newValue);
   } while (oldValue != yieldedValue);
   assert((oldValue & NonLockBitsMask) != ID);
   fatLock->associatedObject = NULL;
@@ -64,23 +64,23 @@ void ThinLock::removeFatLock(FatLock* fa
   
 FatLock* ThinLock::changeToFatlock(gc* object, LockSystem& table) {
   llvm_gcroot(object, 0);
-  if (!(object->header & FatMask)) {
+  if (!(object->header() & FatMask)) {
     FatLock* obj = table.allocate(object);
-    uint32 count = (object->header & ThinCountMask) >> ThinCountShift;
+    uint32 count = (object->header() & ThinCountMask) >> ThinCountShift;
     obj->acquireAll(object, count + 1);
     word_t oldValue = 0;
     word_t newValue = 0;
     word_t yieldedValue = 0;
     word_t ID = obj->getID();
     do {
-      oldValue = object->header;
+      oldValue = object->header();
       newValue = ID | (oldValue & NonLockBitsMask);
       assert(obj->associatedObject == object);
-      yieldedValue = __sync_val_compare_and_swap(&(object->header), oldValue, newValue);
-    } while (((object->header) & ~NonLockBitsMask) != ID);
+      yieldedValue = __sync_val_compare_and_swap(&(object->header()), oldValue, newValue);
+    } while (((object->header()) & ~NonLockBitsMask) != ID);
     return obj;
   } else {
-    FatLock* res = table.getFatLockFromID(object->header);
+    FatLock* res = table.getFatLockFromID(object->header());
     assert(res && "Lock deallocated while held.");
     assert(res->associatedObject == object);
     return res;
@@ -93,8 +93,8 @@ void printDebugMessage(gc* object, LockS
       "WARNING: [%p] has been waiting really long for %p (header = %p)\n",
       (void*)vmkit::Thread::get(),
       (void*)object,
-      (void*)object->header);
-  FatLock* obj = table.getFatLockFromID(object->header);
+      (void*)object->header());
+  FatLock* obj = table.getFatLockFromID(object->header());
   if (obj != NULL) {
     fprintf(stderr,
         "WARNING: [%p] is waiting on fatlock %p. "
@@ -113,15 +113,15 @@ void ThinLock::acquire(gc* object, LockS
   word_t newValue = 0;
   word_t yieldedValue = 0;
 
-  if ((object->header & System::GetThreadIDMask()) == id) {
+  if ((object->header() & System::GetThreadIDMask()) == id) {
     assert(owner(object, table) && "Inconsistent lock");
-    if ((object->header & ThinCountMask) != ThinCountMask) {
-      uint32 count = object->header & ThinCountMask;
+    if ((object->header() & ThinCountMask) != ThinCountMask) {
+      uint32 count = object->header() & ThinCountMask;
       do {
-        oldValue = object->header;
+        oldValue = object->header();
         newValue = oldValue + ThinCountAdd;
-        yieldedValue = __sync_val_compare_and_swap(&(object->header), oldValue, newValue);
-      } while ((object->header & ThinCountMask) == count);
+        yieldedValue = __sync_val_compare_and_swap(&(object->header()), oldValue, newValue);
+      } while ((object->header() & ThinCountMask) == count);
     } else {
       overflowThinLock(object, table);
     }
@@ -130,12 +130,12 @@ void ThinLock::acquire(gc* object, LockS
   }
 
   do {
-    oldValue = object->header & NonLockBitsMask;
+    oldValue = object->header() & NonLockBitsMask;
     newValue = oldValue | id;
-    yieldedValue = __sync_val_compare_and_swap(&(object->header), oldValue, newValue);
-  } while ((object->header & ~NonLockBitsMask) == 0);
+    yieldedValue = __sync_val_compare_and_swap(&(object->header()), oldValue, newValue);
+  } while ((object->header() & ~NonLockBitsMask) == 0);
 
-  if (((object->header) & ~NonLockBitsMask) == id) {
+  if (((object->header()) & ~NonLockBitsMask) == id) {
     assert(owner(object, table) && "Not owner after quitting acquire!");
     return;
   }
@@ -143,12 +143,12 @@ void ThinLock::acquire(gc* object, LockS
   // Simple counter to lively diagnose possible dead locks in this code.
   int counter = 0;  
   while (true) {
-    if (object->header & FatMask) {
-      FatLock* obj = table.getFatLockFromID(object->header);
+    if (object->header() & FatMask) {
+      FatLock* obj = table.getFatLockFromID(object->header());
       if (obj != NULL) {
         if (obj->acquire(object)) {
-          assert((object->header & FatMask) && "Inconsistent lock");
-          assert((table.getFatLockFromID(object->header) == obj) && "Inconsistent lock");
+          assert((object->header() & FatMask) && "Inconsistent lock");
+          assert((table.getFatLockFromID(object->header()) == obj) && "Inconsistent lock");
           assert(owner(object, table) && "Not owner after acquring fat lock!");
           break;
         }
@@ -158,30 +158,30 @@ void ThinLock::acquire(gc* object, LockS
     counter++;
     if (counter == 1000) printDebugMessage(object, table);
 
-    while (object->header & ~NonLockBitsMask) {
-      if (object->header & FatMask) {
+    while (object->header() & ~NonLockBitsMask) {
+      if (object->header() & FatMask) {
         break;
       } else {
         vmkit::Thread::yield();
       }
     }
     
-    if ((object->header & ~NonLockBitsMask) == 0) {
+    if ((object->header() & ~NonLockBitsMask) == 0) {
       FatLock* obj = table.allocate(object);
       obj->internalLock.lock();
       do {
-        oldValue = object->header & NonLockBitsMask;
+        oldValue = object->header() & NonLockBitsMask;
         newValue = oldValue | obj->getID();
         assert(obj->associatedObject == object);
-        yieldedValue = __sync_val_compare_and_swap(&object->header, oldValue, newValue);
-      } while ((object->header & ~NonLockBitsMask) == 0);
+        yieldedValue = __sync_val_compare_and_swap(&object->header(), oldValue, newValue);
+      } while ((object->header() & ~NonLockBitsMask) == 0);
 
       if ((getFatLock(object, table) != obj)) {
-        assert((object->header & ~NonLockBitsMask) != obj->getID());
+        assert((object->header() & ~NonLockBitsMask) != obj->getID());
         obj->internalLock.unlock();
         table.deallocate(obj);
       } else {
-        assert((object->header & ~NonLockBitsMask) == obj->getID());
+        assert((object->header() & ~NonLockBitsMask) == obj->getID());
         assert(owner(object, table) && "Inconsistent lock");
         break;
       }
@@ -199,24 +199,24 @@ void ThinLock::release(gc* object, LockS
   word_t oldValue = 0;
   word_t newValue = 0;
   word_t yieldedValue = 0;
-  if ((object->header & ~NonLockBitsMask) == id) {
+  if ((object->header() & ~NonLockBitsMask) == id) {
     do {
-      oldValue = object->header;
+      oldValue = object->header();
       newValue = oldValue & NonLockBitsMask;
-      yieldedValue = __sync_val_compare_and_swap(&object->header, oldValue, newValue);
-    } while ((object->header & ~NonLockBitsMask) == id);
-  } else if (object->header & FatMask) {
-    FatLock* obj = table.getFatLockFromID(object->header);
+      yieldedValue = __sync_val_compare_and_swap(&object->header(), oldValue, newValue);
+    } while ((object->header() & ~NonLockBitsMask) == id);
+  } else if (object->header() & FatMask) {
+    FatLock* obj = table.getFatLockFromID(object->header());
     assert(obj && "Lock deallocated while held.");
     obj->release(object, table);
   } else {
-    assert(((object->header & ThinCountMask) > 0) && "Inconsistent state");    
-    uint32 count = (object->header & ThinCountMask);
+    assert(((object->header() & ThinCountMask) > 0) && "Inconsistent state");
+    uint32 count = (object->header() & ThinCountMask);
     do {
-      oldValue = object->header;
+      oldValue = object->header();
       newValue = oldValue - ThinCountAdd;
-      yieldedValue = __sync_val_compare_and_swap(&(object->header), oldValue, newValue);
-    } while ((object->header & ThinCountMask) == count);
+      yieldedValue = __sync_val_compare_and_swap(&(object->header()), oldValue, newValue);
+    } while ((object->header() & ThinCountMask) == count);
   }
 }
 
@@ -224,12 +224,12 @@ void ThinLock::release(gc* object, LockS
 /// lock.
 bool ThinLock::owner(gc* object, LockSystem& table) {
   llvm_gcroot(object, 0);
-  if (object->header & FatMask) {
-    FatLock* obj = table.getFatLockFromID(object->header);
+  if (object->header() & FatMask) {
+    FatLock* obj = table.getFatLockFromID(object->header());
     if (obj != NULL) return obj->owner();
   } else {
     uint64 id = vmkit::Thread::get()->getThreadID();
-    if ((object->header & System::GetThreadIDMask()) == id) return true;
+    if ((object->header() & System::GetThreadIDMask()) == id) return true;
   }
   return false;
 }
@@ -237,8 +237,8 @@ bool ThinLock::owner(gc* object, LockSys
 /// getFatLock - Get the fat lock is the lock is a fat lock, 0 otherwise.
 FatLock* ThinLock::getFatLock(gc* object, LockSystem& table) {
   llvm_gcroot(object, 0);
-  if (object->header & FatMask) {
-    return table.getFatLockFromID(object->header);
+  if (object->header() & FatMask) {
+    return table.getFatLockFromID(object->header());
   } else {
     return NULL;
   }

Modified: vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp?rev=180280&r1=180279&r2=180280&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp Thu Apr 25 11:46:49 2013
@@ -23,12 +23,12 @@ extern "C" word_t Java_org_j3_mmtk_Objec
 }
 
 extern "C" word_t Java_org_j3_mmtk_ObjectModel_readAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
-  return obj->header;
+  return obj->header();
 }
 
 extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2 (
     MMTkObject* OM, gc* obj, word_t val) {
-  obj->header = val;
+  obj->header() = val;
 }
 
 extern "C" gc* Java_org_j3_mmtk_ObjectModel_objectStartRef__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
@@ -52,13 +52,13 @@ extern "C" gc* Java_org_j3_mmtk_ObjectMo
 }
 
 extern "C" word_t Java_org_j3_mmtk_ObjectModel_prepareAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
-  return obj->header;
+  return obj->header();
 }
 
 extern "C" uint8_t
 Java_org_j3_mmtk_ObjectModel_attemptAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2(
     MMTkObject* OM, gc* obj, word_t oldValue, word_t newValue) { 
-  word_t val = __sync_val_compare_and_swap(&(obj->header), oldValue, newValue);
+  word_t val = __sync_val_compare_and_swap(&(obj->header()), oldValue, newValue);
   return (val == oldValue);
 }
 





More information about the vmkit-commits mailing list