lights.TupleSpace in LighTS 1.3 allows a tuple being inserted using out() while a matching in() is running to interact in such a way that in() never returns.
Consider the case where one thread is inserting a tuple with out() and another is withdrawing it with in(). Consider the follow interleaving of the threads:
1. in() executes inp(), which returns null.
2. out() executes insertTuple() and notifyAll().
3. in() notes that result is null and starts to wait().
At this point, out() has completed but in() will not proceed unless another tuple is inserted (or spontaneous wakeup or thread interruption or suchlike) occurs. The expected behaviour is that in() returns with the inserted matching tuple.
The attached patch fixes this by preventing notifications being sent between checking whether a matching tuple exists and starting to wait.
Remove deadlock on simultaneous in/out