[squeak-dev] Re: [Pharo-project] Another finalization concern:
error handling
Eliot Miranda
eliot.miranda at gmail.com
Mon Oct 11 21:02:35 UTC 2010
Igor,
take a look at the VisualWorks finalization code. There a process is
spawned to run each finalizer, and there is a throttling mechanism to ensure
that the system does not create a flood of processes when lots of objects
are to be finalized. Instead, a new finalization process is created only
when the previous one starts to run. A new finalizer process is created
when the previous one starts because, due to errors, the previous one may
never finish, but it will always start.
outerFinalizationLoop
"Forks a process that will send every finalizable object (weak
indexable class or Ephemeron) on the finalization queue the
mourn message. Separate processes are used to fetch
finalizable objects and to finalize them so that if errors occur
in finalization they don't stop the finalization mechanism
altogether. This method uses the ratchet semaphore to arrange
that each new processes is only forked after the previous
process has made progess. Hence this avoids creating many
new processes that can't run because they have lower priority
than the finalization process, and in the process possibly
running out of memory."
| theBereaved ratchet |
ratchet := Semaphore new.
[FinalizationSemaphore wait.
theBereaved := [self fetchFromFinalizationQueue]
on: self queueOverflowSignal
do: [:ex | ex return: #overflow].
theBereaved == nil ifFalse:
[[ratchet signal.
self innerFinalizationLoopWith: theBereaved]
forkAt: Processor lowIOPriority.
ratchet wait]] repeat
innerFinalizationLoopWith: initialValue
"Sends every finalizable object (weak indexable class or Ephemeron) on the
finalization queue the mourn message."
initialValue == #overflow ifTrue:
[^self handleFinalizationQueueOverflow].
[| theBereaved |
theBereaved := initialValue.
[theBereaved mourn.
(theBereaved := self fetchFromFinalizationQueue) ~~ nil] whileTrue]
on: self queueOverflowSignal
do: [:ex |
self handleFinalizationQueueOverflow.
ex return]
(there are details like the use of handleFinalizationQueueOverflow that you
can ignore)
HTH
Eliot
On Mon, Oct 11, 2010 at 1:17 PM, Igor Stasenko <siguctua at gmail.com> wrote:
> On 11 October 2010 22:49, Schwab,Wilhelm K <bschwab at anest.ufl.edu> wrote:
> > Sig,
> >
> > The most important words in there are "critical section." Carry on :)
> >
>
> Oh, please. This is not too hard to code.
>
> My mind rolling around following choice(s) (there may be others i don't
> see).
> What would be a proper way to handle error during #finalize.
>
> [ executor finalize ] on: Error do: [:ex |
> self handleFinalizationError: ex "where self is registry"
> ].
>
> or:
>
> [ executor finalize ] on: Error do: [:ex |
> executor handleFinalizationError: ex
> ].
>
>
> of course, i should catch this error in test, so i can verify that:
>
> a) test is get notified upon synthetically made error
> b) no matter what i do inside error handler (up to 'Processor
> activeProcess terminate'), a finalization process continues working
> (or restarts without losing remainder of executors).
>
>
> Also, i used #ensure: and #ifCurtailed: but i tend to forget where
> they are applicable and how.
> So, little help in this regard will be wellcome.
>
> > Bill
> >
> --
> Best regards,
> Igor Stasenko AKA sig.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20101011/9b0ac8be/attachment.htm
More information about the Squeak-dev
mailing list
|