bryce@kampjes.demon.co.uk wrote:
Squeak stops responding, Alt-. will not recover. It's consuming 100% of the CPU but is spending a decent amount of time in the idle loop. Alt-. may occasionally pop up a debugger but normally the image becomes completely unresponsive. printAllStacks has shown over 80 profiling threads running which indicates that they are not getting terminated.
Thanks. I think the problem is the simulation of nested unwind blocks. Here is an example for the kind of problem:
p1 := [ (Delay forMilliseconds: 1000) wait. ] forkAt: Processor activePriority+1. p2 := [ | timout | timout := Time millisecondClockValue+1000. [[timeout < Time millisecondClockValue] whileTrue] ensure:[p1 terminate]. ] forkAt: Processor activePriority-1. (Delay forMilliseconds: 500) wait. p2 terminate.
For some reason this explodes with a nil DNU: < but I think the root cause is the (nested) simulation of unwind handling. And to make things more interesting, for some inexplicable reason the simpler variant works fine:
p1 := [(Delay forMilliseconds: 1000) wait] forkAt: Processor activePriority+1. p2 := [[[(Delay forMilliseconds: 1000) wait] whileTrue] ensure:[p1 terminate] ] forkAt: Processor activePriority-1. (Delay forMilliseconds: 500) wait. p2 terminate.
I'm pretty certain this is what you're seeing. The reason it would show in 3.10 and not in 3.9 is that in 3.10 Delay>>wait has an unwind protect block to ensure that ridiculously long delays that are terminated get taken out of the timer queue.
Cheers, - Andreas