Re[2]: slowLockMutex / putHeavyLock
Patrick Tullmann
kaffe@rufus.w3.org
Thu, 30 Nov 2000 14:00:46 -0700
Maxim Kizub wrote:
> GB> Which COMPARE_AND_EXCHANGE macro does it use?
This is still an important question. There is a completely bogus
definition of COMPARE_AND_EXCHANGE() for architectures on which we do
not have an atomic compare and swap operation.
In locks.c, change the second definition of COMPARE_AND_SWAP() to a
#error directive and recompile. (We should probably do this, or
perhaps protect it with jmutexes?)
> Let me try. But note - sometimes I had asserts
> related to synchronization, and they were "false".
> I mean, I have a dual processor machine, and,
> for example, and asseret
> assert(xxx==0 && yyy==0)
> was caught, but debugger shows, that both
> xxx and yyy are nulls. Probably, that's
> because of my dual-processor computer...
That seems pretty unlikely to me...
[... backtraces ...]
> Ok, I hope this will help. BTW, I see now that this is a secondary
> error, because one of threads tryes to throw an error
> "IllegalMonitorState", but anyway -
> 1. why program has caused it?
I belive the synchronization primitives are fubar on your system. It
could be the jmutex implementation, or (my guess) the
COMPARE_AND_EXCHANGE macro.
> 3. Take, for example, this code:
>
> [ _lockMutex() ]
>
>
> as you see - lkp is not protected at all.
The COMPARE_AND_EXCHANGE is supposed to provide all the protection.
Have you looked at FAQ/FAQ.locks? It tries to describe the locking
algorithm (thought I think its wrong wrt to the exact relationship
between threads and ksems.)
> If val != 0, this doesn't mean that in next statement it's != 0,
> i.e. in this time another thread may execute some code to change
> lkp.
I'm not sure about this... Mostly because the scenario you describe
could happen on a uniprocessor (by switching threads right after the
val == 0 check)...
Still, I can't convince myself that you're wrong by looking at the
code. However, instead of using spinon/spinoff, I think the (val ==
0) check could just be replaced with an immediate call to
COMPARE_AND_EXCHANGE (which should be atomic wrt the
COMPARE_AND_EXCHANGE in _unlockMutex() that sets *lkp to NULL).
Anyone else want to chime in with a clue on this stuff?
-Pat
----- ----- ---- --- --- -- - - - - -
Pat Tullmann tullmann@cs.utah.edu
Thisemailhasbeenbroughttoyoubycocacolafavoredbyprogrammerseverywhere