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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Oct 19 01:07:04 PDT 2009


Author: geoffray
Date: Mon Oct 19 03:07:02 2009
New Revision: 84472

URL: http://llvm.org/viewvc/llvm-project?rev=84472&view=rev
Log:
Add a LockSystem to implement JavaLock allocations.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaLocks.h Mon Oct 19 03:07:02 2009
@@ -21,6 +21,7 @@
 
 class JavaObject;
 class JavaThread;
+class Jnjvm;
 
 class JavaLock : public mvm::PermanentObject {
 
@@ -75,11 +76,11 @@
     return internalLock.getOwner();
   }
   
-  /// JavaLock - Empty constructor.
-  JavaLock(uint32_t i) {
+  /// JavaLock - Default constructor.
+  JavaLock(uint32_t i, JavaObject* a) {
     firstThread = 0;
     index = i;
-    associatedObject = 0;
+    associatedObject = a;
     waitingThread = 0;
   }
 
@@ -87,6 +88,47 @@
   
 };
 
+/// LockSystem - This class manages all Java locks used by the applications.
+/// Each JVM must own an instance of this class and allocate Java locks
+/// with it.
+///
+class LockSystem {
+public:
+  static const uint32_t GlobalSize = 128;
+  static const uint32_t BitIndex = 11;
+  static const uint32_t IndexSize = 1 << BitIndex;
+  static const uint32_t BitMask = IndexSize - 1;
+  static const uint32_t MaxLocks = GlobalSize * IndexSize;
+
+  /// LockTable - The global table that will hold the locks. The table is
+  /// a two-dimensional array, and only one entry is created, so that
+  /// the lock system does not eat up all memory on startup.
+  ///  
+  JavaLock* ** LockTable;
+  
+  /// currentIndex - The current index in the tables. Always incremented,
+  /// never decremented.
+  ///
+  uint32_t currentIndex;
+  
+  /// threadLock - Spin lock to protect the currentIndex field.
+  ///
+  mvm::SpinLock threadLock;
+  
+  /// associatedVM - The JVM associated with this lock system.
+  ///
+  Jnjvm* associatedVM;  
+
+  /// allocate - Allocate a JavaLock.
+  ///
+  JavaLock* allocate(JavaObject* obj); 
+  
+  /// LockSystem - Default constructor. Initialize the table.
+  ///
+  LockSystem(Jnjvm* vm);
+
+};
+
 }
 
 #endif

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Oct 19 03:07:02 2009
@@ -1269,7 +1269,7 @@
 }
 
 Jnjvm::Jnjvm(mvm::BumpPtrAllocator& Alloc, JnjvmBootstrapLoader* loader) : 
-  VirtualMachine(Alloc) {
+  VirtualMachine(Alloc), lockSystem(this) {
 
   classpath = getenv("CLASSPATH");
   if (!classpath) classpath = ".";
@@ -1393,7 +1393,44 @@
 
 JavaLock* JavaLock::allocate(JavaObject* obj) {
   Jnjvm* vm = JavaThread::get()->getJVM();
-  JavaLock* res = new(vm->allocator, "Lock") JavaLock(0);
-  res->associatedObject = obj;
+  JavaLock* res = vm->lockSystem.allocate(obj);  
   return res;
 }
+
+JavaLock* LockSystem::allocate(JavaObject* obj) { 
+  
+// Get an index.
+  threadLock.lock();
+  
+  uint32_t index = currentIndex++;
+  if (index == MaxLocks) {
+    fprintf(stderr, "Ran out of space for allocating locks");
+    abort();
+  }
+  
+  JavaLock** tab = LockTable[index >> BitIndex];
+  
+  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);
+    
+  // Add the lock to the table.
+  uint32_t internalIndex = index & BitMask;
+  tab[internalIndex] = res;
+    
+  // Return the lock.
+  return res;
+}
+  
+LockSystem::LockSystem(Jnjvm* vm) {
+  associatedVM = vm;
+  LockTable = (JavaLock* **)
+    vm->allocator.Allocate(GlobalSize, "Global LockTable");
+  LockTable[0] = (JavaLock**)
+    vm->allocator.Allocate(IndexSize, "Index LockTable");
+  currentIndex = 0;
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon Oct 19 03:07:02 2009
@@ -20,6 +20,7 @@
 #include "mvm/Threads/Cond.h"
 #include "mvm/Threads/Locks.h"
 
+#include "JavaLocks.h"
 #include "JnjvmConfig.h"
 #include "JNIReferences.h"
 #include "LockedMap.h"
@@ -191,6 +192,10 @@
   ///
   ThreadSystem threadSystem;
   
+  /// lockSystem - The lock system to allocate and manage Java locks.
+  ///
+  LockSystem lockSystem;
+  
   /// argumentsInfo - The command line arguments given to the vm
   ///
   ClArgumentsInfo argumentsInfo;





More information about the vmkit-commits mailing list