[vmkit-commits] [vmkit] r84483 - in /vmkit/trunk: include/mvm/Threads/Locks.h lib/JnJVM/VMCore/JavaClass.h lib/JnJVM/VMCore/JavaLocks.h lib/JnJVM/VMCore/Jnjvm.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Oct 19 02:29:28 PDT 2009
Author: geoffray
Date: Mon Oct 19 04:29:28 2009
New Revision: 84483
URL: http://llvm.org/viewvc/llvm-project?rev=84483&view=rev
Log:
Put indexes instead of pointers into the thin lock word.
Modified:
vmkit/trunk/include/mvm/Threads/Locks.h
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
Modified: vmkit/trunk/include/mvm/Threads/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Locks.h?rev=84483&r1=84482&r2=84483&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Locks.h (original)
+++ vmkit/trunk/include/mvm/Threads/Locks.h Mon Oct 19 04:29:28 2009
@@ -227,7 +227,7 @@
TFatLock* obj = TFatLock::allocate(O);
IsGC::gcroot(obj, 0);
obj->acquireAll(257);
- lock = ((uintptr_t)obj >> 1) | FatMask;
+ lock = obj->getID();
}
/// initialise - Initialise the value of the lock to the thread ID that is
@@ -249,13 +249,12 @@
if (!(lock & FatMask)) {
TFatLock* obj = TFatLock::allocate(O);
IsGC::gcroot(obj, 0);
- size_t val = (((size_t) obj) >> 1) | FatMask;
uint32 count = lock & ThinCountMask;
obj->acquireAll(count + 1);
- lock = val;
+ lock = obj->getID();
return obj;
} else {
- return (TFatLock*)(lock << 1);
+ return TFatLock::getFromID(lock);
}
}
@@ -276,7 +275,7 @@
} else {
TFatLock* obj = TFatLock::allocate(O);
IsGC::gcroot(obj, 0);
- uintptr_t val = ((uintptr_t)obj >> 1) | FatMask;
+ uintptr_t val = obj->getID();
loop:
while (lock) {
if (lock & FatMask) {
@@ -293,7 +292,7 @@
} else {
end:
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
obj->acquire();
}
}
@@ -308,7 +307,7 @@
if (lock == id) {
lock = 0;
} else if (lock & FatMask) {
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
IsGC::gcroot(obj, 0);
obj->release();
} else {
@@ -320,7 +319,7 @@
///
void broadcast() {
if (lock & FatMask) {
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
IsGC::gcroot(obj, 0);
obj->broadcast();
}
@@ -329,7 +328,7 @@
/// signal - Wakes up one thread waiting for this lock.
void signal() {
if (lock & FatMask) {
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
IsGC::gcroot(obj, 0);
obj->signal();
}
@@ -342,7 +341,7 @@
if (id == lock) return true;
if ((lock & ThinMask) == id) return true;
if (lock & FatMask) {
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
IsGC::gcroot(obj, 0);
return obj->owner();
}
@@ -351,7 +350,7 @@
mvm::Thread* getOwner() {
if (lock & FatMask) {
- TFatLock* obj = (TFatLock*)(lock << 1);
+ TFatLock* obj = TFatLock::getFromID(lock);
IsGC::gcroot(obj, 0);
return obj->getOwner();
} else {
@@ -362,7 +361,7 @@
/// getFatLock - Get the fat lock is the lock is a fat lock, 0 otherwise.
TFatLock* getFatLock() {
if (lock & FatMask) {
- return (TFatLock*)(lock << 1);
+ return TFatLock::getFromID(lock);
} else {
return 0;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=84483&r1=84482&r2=84483&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Mon Oct 19 04:29:28 2009
@@ -412,6 +412,14 @@
static FatLock* allocate(UserCommonClass* cl) {
return new(cl->classLoader->allocator, "Class fat lock") FatLock();
}
+
+ uintptr_t getID() {
+ return (((uintptr_t)this) >> 1) | mvm::FatMask;
+ }
+
+ static FatLock* getFromID(uintptr_t id) {
+ return (FatLock*)(id << 1);
+ }
void deallocate() {
// Too bad, I can't deallocate it because it is in permanent memory.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h?rev=84483&r1=84482&r2=84483&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h Mon Oct 19 04:29:28 2009
@@ -89,6 +89,8 @@
static JavaLock* allocate(JavaObject*);
void deallocate();
+ uintptr_t getID();
+ static JavaLock* getFromID(uintptr_t val);
};
/// LockSystem - This class manages all Java locks used by the applications.
@@ -96,6 +98,7 @@
/// with it.
///
class LockSystem {
+ friend class JavaLock;
public:
// Fixed values. With these values, an index is on 18 bits.
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=84483&r1=84482&r2=84483&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Oct 19 04:29:28 2009
@@ -1449,3 +1449,13 @@
vm->allocator.Allocate(IndexSize, "Index LockTable");
currentIndex = 0;
}
+
+uintptr_t JavaLock::getID() {
+ return index | mvm::FatMask;
+}
+
+JavaLock* JavaLock::getFromID(uintptr_t ID) {
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ JavaLock* res = vm->lockSystem.getLock(ID & ~mvm::FatMask);
+ return res;
+}
More information about the vmkit-commits
mailing list