stephen at pairhome.net
Fri Sep 19 21:17:58 UTC 2003
Ned Konz wrote:
>On Friday 19 September 2003 11:56 am, Stephen Pair wrote:
>>One of the things that crossed my mind not too long ago is that it
>>would be nice if we could signal exceptions in another process.
>> Error new messageText: 'some error message'; signalProcess:
>> someProcess signal: (Error new messageText: 'some error message';
>>This could be useful for graceful termination of processes (among
>>many other things)...unwind actions could always happen in the
>>process where they were defined. The default action of a Terminate
>>exception would be to terminate the active process. Here's the
>>method that seems to do the trick:
>> Processor activeProcess == self ifTrue: [^anException signal].
>> suspendedContext := MethodContext
>> sender: suspendedContext
>> receiver: self
>> method: thisContext method
>> arguments: (Array with: anException).
>I've asked for this several times and no one has come up with it yet.
>One obvious use of this is to provide Semaphore>>wait methods that
>raise an exception on a timeout.
Of course, if your process happens to be waiting on a Semaphore, sending
#signal: to the process will not wake it up (nothing will happen until
the semaphore gets signaled)...you could add a line to the end of that
method to suspend and resume (ie. "self suspend; resume") and that will
wake it up...but, what I'd really like is a way of waking it up to
process the exception and when you resume the exception have the process
go back into a state where it's still waiting on the original semaphore
(if it hadn't been signaled in the interim). I had a solution for that,
but it seems to have a tendency to crash the VM. ;)
More information about the Squeak-dev