[vmkit-commits] [vmkit] r84112 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp VMCore/CLIJit.cpp VMCore/VMObject.cpp VMCore/VMObject.h

Gael Thomas gael.thomas at lip6.fr
Wed Oct 14 09:51:22 PDT 2009


Author: gthomas
Date: Wed Oct 14 11:51:21 2009
New Revision: 84112

URL: http://llvm.org/viewvc/llvm-project?rev=84112&view=rev
Log:
All access to VMObject::lockObj are safe (use llvm_gcroot)


Modified:
    vmkit/trunk/lib/N3/Mono/Mono.cpp
    vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
    vmkit/trunk/lib/N3/VMCore/VMObject.cpp
    vmkit/trunk/lib/N3/VMCore/VMObject.h

Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=84112&r1=84111&r2=84112&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Wed Oct 14 11:51:21 2009
@@ -119,7 +119,7 @@
 
 extern "C" void System_Threading_Monitor_Monitor_exit(VMObject* obj) {
   // TODO: There's a bug in the bootstrap, see why
-  if (obj->lockObj->owner()) obj->unlock();
+  if (LockObj::owner(obj->lockObj)) obj->unlock();
 }
 
 extern "C" bool System_Threading_Monitor_Monitor_try_enter(VMObject* obj, int ms) {

Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=84112&r1=84111&r2=84112&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Wed Oct 14 11:51:21 2009
@@ -240,7 +240,7 @@
 #endif
 
 #define CASE_ARRAY(name, elmt, nbb, printer, pre, sep, post)						\
-	if(cl->baseClass == MSCorlib::p##name) {													\
+	if(cl->baseClass == MSCorlib::p##name) {															\
 		((void**)res)[VT_PRINT_OFFSET] = ((void **)(unsigned int)Array##name::do_print); \
   } else
 	

Modified: vmkit/trunk/lib/N3/VMCore/VMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.cpp?rev=84112&r1=84111&r2=84112&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.cpp Wed Oct 14 11:51:21 2009
@@ -45,14 +45,11 @@
 	return sizeof(N3VirtualTable) / sizeof(uintptr_t);
 }
 
-void VMObject::initialise(VMCommonClass* cl) {
-  this->classOf = cl;
-  this->lockObj = 0;
-}
-
 
 LockObj* LockObj::allocate() {
-  LockObj* res = new(&_VT) LockObj();
+  declare_gcroot(LockObj*, res) = new(&_VT) LockObj();
+	res->threads = new std::vector<VMThread*>();
+	res->lock    = new mvm::LockRecursive();
   return res;
 }
 
@@ -63,11 +60,14 @@
 
 void LockObj::_destroy(LockObj *self) {
 	llvm_gcroot(self, 0);
+	delete self->threads;
+	delete self->lock;
 }
 
-void LockObj::notify() {
-  for (std::vector<VMThread*>::iterator i = threads.begin(), 
-            e = threads.end(); i!= e; ++i) {
+void LockObj::notify(LockObj *self) {
+	llvm_gcroot(self, 0);
+  for (std::vector<VMThread*>::iterator i = self->threads->begin(), 
+				 e = self->threads->end(); i!= e; ++i) {
     VMThread* cur = *i;
     cur->lock->lock();
     if (cur->interruptFlag != 0) {
@@ -78,50 +78,61 @@
 			if (th != 0) {
 				cur->varcond->signal();
 				cur->lock->unlock();
-				threads.erase(i);
+				self->threads->erase(i);
 				break;
 			} else { // dead thread
-				threads.erase(i);
+				self->threads->erase(i);
 			}
 		}
   }
 }
 
-void LockObj::notifyAll() {
-  for (std::vector<VMThread*>::iterator i = threads.begin(),
-            e = threads.end(); i!= e; ++i) {
+void LockObj::notifyAll(LockObj *self) {
+	llvm_gcroot(self, 0);
+  for (std::vector<VMThread*>::iterator i = self->threads->begin(),
+				 e = self->threads->end(); i!= e; ++i) {
     VMThread* cur = *i;
     cur->lock->lock();
     cur->varcond->signal();
     cur->lock->unlock();
-    threads.erase(i);
+    self->threads->erase(i);
   }
 }
 
-void LockObj::wait(VMThread* th) {
-  threads.push_back(th);
+void LockObj::wait(LockObj *self, VMThread* th) {
+	llvm_gcroot(self, 0);
+  self->threads->push_back(th);
 }
 
-void LockObj::remove(VMThread* th) {
-  for (std::vector<VMThread*>::iterator i = threads.begin(),
-            e = threads.end(); i!= e; ++i) {
+void LockObj::remove(LockObj *self, VMThread* th) {
+	llvm_gcroot(self, 0);
+  for (std::vector<VMThread*>::iterator i = self->threads->begin(),
+				 e = self->threads->end(); i!= e; ++i) {
     if (*i == th) {
-      threads.erase(i);
+      self->threads->erase(i);
       break;
     }
   }
 }
 
-void LockObj::aquire() {
-  lock.lock();
+void LockObj::aquire(LockObj *self) {
+	llvm_gcroot(self, 0);
+  self->lock->lock();
+}
+
+void LockObj::release(LockObj *self) {
+	llvm_gcroot(self, 0);
+  self->lock->unlock();
 }
 
-void LockObj::release() {
-  lock.unlock();
+bool LockObj::owner(LockObj *self) {
+	llvm_gcroot(self, 0);
+  return self->lock->selfOwner();
 }
 
-bool LockObj::owner() {
-  return lock.selfOwner();
+void VMObject::initialise(VMCommonClass* cl) {
+  this->classOf = cl;
+  this->lockObj = 0;
 }
 
 void VMObject::_print(const VMObject *self, mvm::PrintBuffer* buf) {
@@ -134,29 +145,35 @@
 }
 
 static LockObj* myLock(VMObject* obj) {
+	llvm_gcroot(obj, 0);
   verifyNull(obj);
-  if (obj->lockObj == 0) {
+	declare_gcroot(LockObj*, lock) = obj->lockObj;
+  if (lock == 0) {
     VMObject::globalLock->lock();
-    if (obj->lockObj == 0) {
-      obj->lockObj = LockObj::allocate();
+		lock = obj->lockObj;
+    if (lock == 0) {
+			lock = LockObj::allocate();
+      obj->lockObj = lock;
     }
     VMObject::globalLock->unlock();
   }
-  return obj->lockObj;
+  return lock;
 }
 
 void VMObject::aquire() {
-  myLock(this)->aquire();
+	declare_gcroot(LockObj*, lock) = myLock(this);
+	LockObj::aquire(lock);
 }
 
 void VMObject::unlock() {
   verifyNull(this);
-  lockObj->release();
+	declare_gcroot(LockObj*, lock) = myLock(this);
+	LockObj::release(lock);
 }
 
 void VMObject::waitIntern(struct timeval* info, bool timed) {
-  LockObj * l = myLock(this);
-  bool owner = l->owner();
+  declare_gcroot(LockObj *, l) = myLock(this);
+  bool owner = LockObj::owner(l);
 
   if (owner) {
     VMThread* thread = VMThread::get();
@@ -169,10 +186,10 @@
       thread->interruptFlag = 0;
       thread->getVM()->interruptedException(this);
     } else {
-      unsigned int recur = l->lock.recursionCount();
+      unsigned int recur = l->lock->recursionCount();
       bool timeout = false;
-      l->lock.unlockAll();
-      l->wait(thread);
+      l->lock->unlockAll();
+			LockObj::wait(l, thread);
       thread->state = VMThread::StateWaiting;
 
       if (timed) {
@@ -183,10 +200,10 @@
 
       bool interrupted = (thread->interruptFlag != 0);
       mutexThread->unlock();
-      l->lock.lockAll(recur);
+      l->lock->lockAll(recur);
 
       if (interrupted || timeout) {
-        l->remove(thread);
+				LockObj::remove(l, thread);
       }
 
       thread->state = VMThread::StateRunning;
@@ -210,18 +227,18 @@
 }
 
 void VMObject::notify() {
-  LockObj* l = myLock(this);
-  if (l->owner()) {
-    l->notify();
+  declare_gcroot(LockObj*, l) = myLock(this);
+  if (LockObj::owner(l)) {
+		LockObj::notify(l);
   } else {
     VMThread::get()->getVM()->illegalMonitorStateException(this);
   }
 }
 
 void VMObject::notifyAll() {
-  LockObj* l = myLock(this);
-  if (l->owner()) {
-    l->notifyAll();
+  declare_gcroot(LockObj*, l) = myLock(this);
+  if (LockObj::owner(l)) {
+		LockObj::notifyAll(l);
   } else {
     VMThread::get()->getVM()->illegalMonitorStateException(this);
   } 

Modified: vmkit/trunk/lib/N3/VMCore/VMObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.h?rev=84112&r1=84111&r2=84112&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.h Wed Oct 14 11:51:21 2009
@@ -46,22 +46,21 @@
 class LockObj : public mvm::Object {
 public:
 	static N3VirtualTable  _VT;
-  mvm::LockRecursive     lock;
-  std::vector<VMThread*> threads;
+  mvm::LockRecursive     *lock;
+  std::vector<VMThread*> *threads;
 
   static LockObj* allocate();
-
 	static void _destroy(LockObj *);
 	static void _print(const LockObj *, mvm::PrintBuffer *);
   
-  void notify();
-  void notifyAll();
-  void wait(VMThread* th);
-  void remove(VMThread* th);
-
-  void aquire();
-  void release();
-  bool owner();
+  static void notify(LockObj*);
+  static void notifyAll(LockObj*);
+  static void wait(LockObj*, VMThread* th);
+  static void remove(LockObj*, VMThread* th);
+
+  static void aquire(LockObj*);
+  static void release(LockObj*);
+  static bool owner(LockObj*);
 };
 
 #define VALUE_OFFSET 3
@@ -69,7 +68,7 @@
 class VMObject : public mvm::Object {
 public:
   VMCommonClass* classOf;
-  LockObj* lockObj;
+  LockObj*       lockObj;
 
   static mvm::Lock* globalLock;
   static const llvm::Type* llvmType;





More information about the vmkit-commits mailing list