I’m still dealing with this deadlock problem. In some cases, the following might happen: Thread 1 enters
compactWait, but finds out thread 2 is waiting for this synchronization point. Thread 2 wakes thread 1 up and waits for the next synchronization point. Thread 1 terminates, and thread 2 never gets woken up.
What I should try is insert a call to
compactWait (or some other method, maybe
compactEndThread) at the very end of
java.lang.Thread.exit. I’m hoping that this will actually be at the end of a thread’s life, and there won’t be any more sync points afterwards. Otherwise, this is not going to work.
This call will check if there is a thread waiting to be woken up at the current index, and if so, wake it up. Otherwise, it’s a no-op, because there should be a thread running already, about to enter
compactWait and execute.
If this doesn’t work, e.g. because there are still sync points happening after
java.lang.Thread.exit, then I could try some kind of “counting scheme”. I count the number of threads alive and how many of them are currently waiting. If the second number ever becomes equal to the first number, I’d have to wake a thread up. But that seems more complicated right now.
I don’t feel too well right now – felt awful yesterday, too – but I have a date. Time for dinner and a movie.