[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