Alan L. Batongbacal wrote:
> Correct. I use ThreadState just because it deadlocks the fastest :)
Just to be clear: this test *always* locks up, right? You just have
trouble creating a deadlock that gdb can dump state about, right? Do
you know if it is always deadlocking in the same place?
I've attached a patch for locks.c that adds some more SLOWLOCK
debugging magic. Makes it a bit easier to read the trace... I
haven't looked too closely at the output generated by the
Kaffe unix-jthreads version, though.
If someone wants to check this in, here's a ChangeLog:
Patrick Tullmann <[EMAIL PROTECTED]>
* kaffe/kaffevm/locks.c: Add a bunch more SLOWLOCKS debugging
printfs.
-Pat
----- ----- ---- --- --- -- - - - - -
Pat Tullmann [EMAIL PROTECTED]
That which does not kill you just didn't try hard enough.
Index: kaffe/kaffevm/locks.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/locks.c,v
retrieving revision 1.34
diff -u -u -r1.34 locks.c
--- locks.c 1999/12/10 07:49:04 1.34
+++ locks.c 2000/04/11 23:33:14
@@ -1,5 +1,5 @@
/*
- * fastlocks.c
+ * locks.c
* Manage locking system
*
* Copyright (c) 1996-1999
@@ -99,8 +99,8 @@
int i;
DBG(SLOWLOCKS,
- dprintf("getHeavyLock(**lkp=%p, *lk=%p)\n",
- lkp, *lkp);
+ dprintf(" getHeavyLock(**lkp=%p, *lk=%p, th=%p)\n",
+ lkp, *lkp, jthread_current());
)
timeout = 1;
@@ -121,6 +121,9 @@
/* If bottom bit is set, strip off and use pointer as pointer to heavy
lock */
if ((((uintp)old) & 1) == 1) {
+DBG(SLOWLOCKS,
+ dprintf(" got cached lock\n");
+)
lk = (iLock*)(((uintp)old) & (uintp)-2);
}
else {
@@ -133,7 +136,7 @@
}
}
DBG(SLOWLOCKS,
- dprintf(" got %s lock\n",
+ dprintf(" got %s lock\n",
(lk == 0) ? "new" : "special");
)
if (lk == 0) {
@@ -158,8 +161,8 @@
assert(*lkp == LOCKINPROGRESS);
DBG(SLOWLOCKS,
- dprintf("putHeavyLock(**lkp=%p, *lk=%p)\n",
- lkp, lk);
+ dprintf(" putHeavyLock(**lkp=%p, *lk=%p, th=%p)\n",
+ lkp, lk, jthread_current());
)
if (lk == LOCKFREE) {
@@ -181,8 +184,8 @@
Hjava_lang_Thread* tid;
DBG(SLOWLOCKS,
- printf("slowLockMutex(**lkp=%p, where=%p)\n",
- lkp, where);
+ dprintf("slowLockMutex(**lkp=%p, where=%p, th=%p)\n",
+ lkp, where, jthread_current());
)
for (;;) {
@@ -223,8 +226,8 @@
int i;
DBG(SLOWLOCKS,
- printf("slowUnlockMutex(**lkp=%p, where=%p)\n",
- lkp, where);
+ dprintf("slowUnlockMutex(**lkp=%p, where=%p, th=%p)\n",
+ lkp, where, jthread_current());
)
lk = getHeavyLock(lkp);
@@ -277,6 +280,11 @@
iLock* lk;
void* holder;
+DBG(SLOWLOCKS,
+ dprintf("slowUnlockMutexIfHeld(**lkp=%p, where=%p, th=%p)\n",
+ lkp, where, jthread_current());
+)
+
lk = getHeavyLock(lkp);
holder = lk->holder;
putHeavyLock(lkp, lk);
@@ -292,6 +300,11 @@
iLock* lk;
void* holder;
+DBG(SLOWLOCKS,
+ dprintf("_releaseLock(**lkp=%p, th=%p)\n",
+ lkp, jthread_current());
+)
+
lk = getHeavyLock(lkp);
holder = lk->holder;
@@ -319,6 +332,11 @@
Hjava_lang_Thread** ptr;
jboolean r;
+DBG(SLOWLOCKS,
+ dprintf("_waitCond(**lkp=%p, timeout=%ld, th=%p)\n",
+ lkp, (long)timeout, jthread_current());
+)
+
lk = getHeavyLock(lkp);
holder = lk->holder;
@@ -373,6 +391,11 @@
iLock* lk;
Hjava_lang_Thread* tid;
+DBG(SLOWLOCKS,
+ dprintf("_signalCond(**lkp=%p, th=%p)\n",
+ lkp, jthread_current());
+)
+
lk = getHeavyLock(lkp);
if (!jthread_on_current_stack(lk->holder)) {
@@ -396,6 +419,11 @@
{
iLock* lk;
Hjava_lang_Thread* tid;
+
+DBG(SLOWLOCKS,
+ dprintf("_broadcastCond(**lkp=%p, th=%p)\n",
+ lkp, jthread_current());
+)
lk = getHeavyLock(lkp);