[kaffe] CVS kaffe (guilhem): Recursive lock fix.

Kaffe CVS cvs-commits at kaffe.org
Fri Apr 1 09:06:43 PST 2005


PatchSet 5635 
Date: 2005/04/01 17:00:51
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Recursive lock fix.

Members: 
	ChangeLog:1.3806->1.3807 
	kaffe/kaffevm/locks.c:1.60->1.61 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3806 kaffe/ChangeLog:1.3807
--- kaffe/ChangeLog:1.3806	Fri Apr  1 06:22:11 2005
+++ kaffe/ChangeLog	Fri Apr  1 17:00:51 2005
@@ -1,3 +1,8 @@
+2005-04-01  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* kaffe/kaffevm/locks.c
+	(waitCond): Unlock completely the mutex (the lock may be recursive).
+
 2005-04-01  Dalibor Topic  <robilad at kaffe.org>
 
 	* libraries/javalib/Makefile.am.in (clean-local): 
Index: kaffe/kaffe/kaffevm/locks.c
diff -u kaffe/kaffe/kaffevm/locks.c:1.60 kaffe/kaffe/kaffevm/locks.c:1.61
--- kaffe/kaffe/kaffevm/locks.c:1.60	Sun Mar 20 20:30:43 2005
+++ kaffe/kaffe/kaffevm/locks.c	Fri Apr  1 17:00:55 2005
@@ -366,6 +366,7 @@
   volatile jthread_t *ptr;
   jboolean r;
   threadData *tdata;
+  unsigned int oldLockCount;
   
   DBG(SLOWLOCKS,
       dprintf("_waitCond(lk=%p, timeout=%ld, th=%p)\n",
@@ -384,6 +385,11 @@
   tdata = KTHREAD(get_data)(cur);
   tdata->nextlk = lk->cv;
   lk->cv = cur;
+  /* Here we need to reduce the lock count to 1 to be sure
+   * the lock is completely released when we invoke slowUnlockMutex.
+   */
+  oldLockCount = lk->lockCount;
+  lk->lockCount = 1;
 
   putHeavyLock(lk);
   slowUnlockMutex((volatile iLock *volatile *)lkp, heavyLock);
@@ -417,6 +423,10 @@
   }
   
   slowLockMutex((volatile iLock *volatile *)lkp, heavyLock);
+  /* This is safe as no other thread touches the lockcount if it is not
+   * owning the lock.
+   */
+  lk->lockCount = oldLockCount;
   
   return (r);
 }




More information about the kaffe mailing list