[vmkit-commits] [vmkit] r84473 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.h JavaLocks.h Jnjvm.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Oct 19 01:46:42 PDT 2009


Author: geoffray
Date: Mon Oct 19 03:46:41 2009
New Revision: 84473

URL: http://llvm.org/viewvc/llvm-project?rev=84473&view=rev
Log:
Add a freelist cache for allocating JavaLocks.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=84473&r1=84472&r2=84473&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Mon Oct 19 03:46:41 2009
@@ -412,6 +412,10 @@
     static FatLock* allocate(UserCommonClass* cl) {
       return new(cl->classLoader->allocator, "Class fat lock") FatLock();
     }
+    
+    void deallocate() {
+      // Too bad, I can't deallocate it because it is in permanent memory.
+    }
 
     void acquire() {
       lockVar.lock();

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h?rev=84473&r1=84472&r2=84473&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h Mon Oct 19 03:46:41 2009
@@ -26,6 +26,7 @@
 class JavaLock : public mvm::PermanentObject {
 
 friend class JavaObject;
+friend class LockSystem;
 
 private:
   mvm::LockRecursive internalLock;
@@ -33,6 +34,7 @@
   JavaThread* firstThread;
   JavaObject* associatedObject;
   uint32_t index;
+  JavaLock* nextFreeLock;
 
 public:
 
@@ -85,6 +87,7 @@
   }
 
   static JavaLock* allocate(JavaObject*);
+  void deallocate();
   
 };
 
@@ -94,6 +97,8 @@
 ///
 class LockSystem {
 public:
+  
+  // Fixed values. With these values, an index is on 18 bits.
   static const uint32_t GlobalSize = 128;
   static const uint32_t BitIndex = 11;
   static const uint32_t IndexSize = 1 << BitIndex;
@@ -110,7 +115,11 @@
   /// never decremented.
   ///
   uint32_t currentIndex;
-  
+ 
+  /// freeLock - The list of locks that are allocated and available.
+  ///
+  JavaLock* freeLock;
+ 
   /// threadLock - Spin lock to protect the currentIndex field.
   ///
   mvm::SpinLock threadLock;
@@ -122,11 +131,26 @@
   /// allocate - Allocate a JavaLock.
   ///
   JavaLock* allocate(JavaObject* obj); 
-  
+ 
+  /// deallocate - Put a lock in the free list lock.
+  ///
+  void deallocate(JavaLock* lock) {
+    lock->associatedObject = 0;
+    threadLock.lock();
+    lock->nextFreeLock = freeLock;
+    freeLock = lock;
+    threadLock.unlock();
+  }
+
   /// LockSystem - Default constructor. Initialize the table.
   ///
   LockSystem(Jnjvm* vm);
 
+  /// getLock - Get a lock from an index in the table.
+  ///
+  JavaLock* getLock(uint32_t index) {
+    return LockTable[index >> BitIndex][index & BitMask];
+  }
 };
 
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=84473&r1=84472&r2=84473&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Oct 19 03:46:41 2009
@@ -1397,30 +1397,45 @@
   return res;
 }
 
+void JavaLock::deallocate() {
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  vm->lockSystem.deallocate(this);
+}
+
 JavaLock* LockSystem::allocate(JavaObject* obj) { 
   
-// Get an index.
+  JavaLock* res = 0;
   threadLock.lock();
+
+  // Try the freeLock list.
+  if (freeLock) {
+    res = freeLock;
+    freeLock = res->nextFreeLock;
+    res->nextFreeLock = 0;
+    threadLock.unlock();
+    res->associatedObject = obj;
+  } else { 
+    // Get an index.
+    uint32_t index = currentIndex++;
+    if (index == MaxLocks) {
+      fprintf(stderr, "Ran out of space for allocating locks");
+      abort();
+    }
   
-  uint32_t index = currentIndex++;
-  if (index == MaxLocks) {
-    fprintf(stderr, "Ran out of space for allocating locks");
-    abort();
-  }
-  
-  JavaLock** tab = LockTable[index >> BitIndex];
+    JavaLock** tab = LockTable[index >> BitIndex];
   
-  if (tab == NULL) 
-    tab = (JavaLock**)associatedVM->allocator.Allocate(IndexSize,
-                                                       "Index LockTable");
-  threadLock.unlock();
+    if (tab == NULL) 
+      tab = (JavaLock**)associatedVM->allocator.Allocate(IndexSize,
+                                                         "Index LockTable");
+    threadLock.unlock();
    
-  // Allocate the lock.
-  JavaLock* res = new(associatedVM->allocator, "Lock") JavaLock(index, obj);
+    // Allocate the lock.
+    res = new(associatedVM->allocator, "Lock") JavaLock(index, obj);
     
-  // Add the lock to the table.
-  uint32_t internalIndex = index & BitMask;
-  tab[internalIndex] = res;
+    // Add the lock to the table.
+    uint32_t internalIndex = index & BitMask;
+    tab[internalIndex] = res;
+  }
     
   // Return the lock.
   return res;





More information about the vmkit-commits mailing list