Problems related to Kaffe lockObjec/unlockObject
Godmar Back
kaffe@rufus.w3.org
Tue, 4 Dec 2001 16:01:30 -0700 (MST)
You're right. This stuff is simply broken.
Don't use lockObject/unlockObject. Use lockMutex/unlockMutex instead.
If you can, that is. [ Alternatively, turn deferred-pop optimizations
off in your compiler (gcc can do that, look up the flag...) and hope
you get lucky. This would at least allow lockObject/unlockObject
from within the same function. ]
Tim knows it's broken - maybe the handheld/pocket Linux edition of
kaffe has a fix by now?
- Godmar
>
>
> Dear all,
> In kaffe 1.0.6, the lockObject/unlockObject in locks.c are just a wrapper
> of lockMutex/unlockMutex. In kaffe, lockObject uses "&obj" as the "where"
> parameter in lockMutex. As the lockMutex and unlockMutex support recursive
> locks, and determine whether it is a last unlock by the following checking :
> if (lk->holder > where) {
> putHeavyLock(lkp, lk);
> ...
> }
> So the value of "where" is important for the unlocking.
> Now comes the problem. When we call LockObject(obj) in one stack frame, the
> slot address for obj(i.e. &obj) is the address in the current frame. But
> that slot address may be smaller than the stack address of object in a
> subsequence call to unlockObj(obj); therefore that unlockObject(obj) will
> mistakenly assume that that is a recursive lock and won't unlock the
> object.
> Any comments will be appreciated. Thanks.
>
> Regards,
> Zhu Wenzhang
>