[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