If we intend to modify/enhance the VM what about the old classic #valueUninterrupatably (VA didn't quite pin it totally down, but it did the job, mostly). That is, a way of doing something totally atomically with respect to the VM. To be used sparingly, of course!
-----Original Message----- From: squeak-dev-bounces@lists.squeakfoundation.org [mailto:squeak-dev-bounces@lists.squeakfoundation.org]On Behalf Of Andreas Raab Sent: 05 December 2007 4:44 PM To: The general-purpose Squeak developers list Subject: Re: Process>>terminate woes
Lukas Renggli wrote:
I've also noticed that Process>>isTerminated is not thread-safe...
And #signalException:
Good one. Yes, this needs fixing. My suggestion would be (with the other changes):
signalException: anException | oldList | self isActiveProcess ifTrue: [^anException signal].
"Suspend myself first to ensure that I won't run away in the midst of the following modifications." oldList := self suspend.
"Add a new method context to the stack that will signal the exception" suspendedContext := MethodContext sender: suspendedContext receiver: self method: (self class lookupSelector: #pvtSignal:list:) arguments: (Array with: anException with: oldList).
"If we were on a list to run, then suspend and restart the receiver (this lets the receiver run if it is currently blocked on a semaphore). If we are not on a list to be run (i.e. this process is suspended), then when the process is resumed, it will signal the exception"
oldList ifNotNil: [self resume].
Cheers,
- Andreas