Hi Luc, Sean, Igor,

I still don't think that is right (although I did not actually try to run your 
approach): you still make the block closure of the process refer strongly to 
the timer object.

I tried it as follows (.st file included at the end):

Object subclass: #TestTimer
        instanceVariableNames: 'counter interval'

TestTimer>>#initialize
        interval := 5 seconds asDelay.
        counter := 0.
        self class start: (WeakArray with: self)

TestTimer>>#tick
        interval wait.
        counter := counter + 1

TestTimer class>>#start: reference
        [ 
                [ reference first isNil ] whileFalse: [ 
                        reference first tick ] ] 
                forkAt: Processor userBackgroundPriority 
                named: 'Test Timer'

Sadly it still does not work, and I don't know why ;-)

        TestTimer new.

        3 timesRepeat: [ Smalltalk garbageCollect ].

        TestTimer allInstances

You can see the timer count going up every 5 seconds when inspecting the 
instance, but you have to close the inspector otherwise that is another 
reference. Exploring strong pointers lists the WeakArray instance... 

Sven

Attachment: TestTimer.st
Description: Binary data


On 23 Apr 2013, at 16:01, Luc Fabresse <[email protected]> wrote:

> Hi Sean,
> 
>   We experienced that also with Noury and Jannik.
>  The trick has been to extract the block in a class side method.
>  Example: 
> 
>  Timer>>start
>     process := self class createProcessFor: self
> 
>  Timer class>>createProcessFor: aTimer
>   ^[ aTimer value: aTimer value + 1.......] fork
> 
> 
>  Now:
> 
>  t := Timer new start. 
>  t := nil
> 
>  makes the process dispear as well.
>  ok not really beautiful but it works ;-)
> 
> Cheers,
> 
> Luc
> 
> 
> 
> 
> #Luc
> 
> 
> 2013/4/23 Igor Stasenko <[email protected]>
> On 23 April 2013 14:17, Sean P. DeNigris <[email protected]> wrote:
> > Igor Stasenko wrote
> >> you don't need finalization.. just a weak reference. something like this:
> >>
> >> array := WeakArray with: myObject.
> >>
> >> [[ array first notNil] whileTrue: [ ...... ]] fork.
> >
> > Timer>>start
> >
> >         | array |
> >         array := WeakArray with: self.
> >         process := [
> >                 [ array first notNil ] whileTrue: [
> >                         interval asDelay wait.
> >                         self value: self value + 1.
> >                         self announcer announce: (TimerValueChanged to: 
> > self value) ] ] fork.
> >
> > Timer new start.
> > Smalltalk garbageCollect.
> >
> > The process is still there...
> 
> but what you expecting?
> you refer to 'self' multiple times. sure thing it cannot be GC-ed,
> neither process will die because
> of plenty of references on stack.
> Even block closure which you creating for fork will have home context
> which keeps reference to 'self',
> e.g. receiver.
> 
> 
> > I'm attaching (to Nabble) a screenshot of #pointersTo
> > <http://forum.world.st/file/n4683095/Screen_Shot_2013-04-23_at_8.16.01_AM.png>
> >
> >
> >
> > -----
> > Cheers,
> > Sean
> > --
> > View this message in context: 
> > http://forum.world.st/Terminating-a-Process-when-an-object-dies-tp4683036p4683095.html
> > Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
> >
> 
> 
> 
> --
> Best regards,
> Igor Stasenko.
> 
> 

Reply via email to