Michael van der Gulik
squeakml at gulik.co.nz
Tue Aug 22 10:10:50 UTC 2006
Bert Freudenberg wrote:
> Michael van der Gulik schrieb:
>> I thought of a better option today: Create a "PollingService"
>> singleton. The process I needed was just meant to slowly poll something.
>> Rather than doing "[[self doSomething] repeat ] fork", I could ask the
>> PollingService to poll me on a regular basis. The polling service
>> would have something like:
>> PollingService>>pollObject: n
>> | o |
>> o := myWeakArray at: n.
>> [ o isNil ] whileFalse: [ o poll. o:= myWeakArray at: n. ].
>> So that when the object is garbage collected, the thread would also
>> stop iterating. A very useful pattern!
>> This could maybe even be done on the class side of that object.
>> I hope the small amount of time between loop iterations is enough to
>> get the GC to make the weak reference nil.
> Unlikely. Once an object gets tenured, only a full GC will collect it:
Ahh... I'd like to confirm that my approach indeed doesn't work, even if
I stick a 'Smalltalk garbageCollect' in the middle of it. Argh.
Code attached, if you can be bothered looking at it.
> Do you really have random objects that are not owned by some specific
> object that could release them?
Well, probably. I've just had another idea that I'll try.
-------------- next part --------------
'From Squeak3.8 of ''5 May 2005'' [latest update: #6665] on 22 August 2006 at 10:07:34 pm'!
Object subclass: #TestPoller
!TestPoller commentStamp: 'mvdg 8/22/2006 22:07' prior: 0!
Test a polling pattern I made. It doesn't work.
p := TestPoller new.
p := nil.
Now, the transcript should stop showing 'bleep'. If your image is important, you'll need to stop the Bleeper process.!
!TestPoller methodsFor: 'as yet unclassified' stamp: 'mvdg 8/22/2006 21:43'!
delay := Delay forSeconds: 1.
self class startPolling: self.! !
!TestPoller methodsFor: 'as yet unclassified' stamp: 'mvdg 8/22/2006 21:42'!
Transcript show: 'bleep '.
delay wait.! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
!TestPoller class methodsFor: 'as yet unclassified' stamp: 'mvdg 8/22/2006 22:04'!
| w x |
w := WeakArray with: object.
x := w at: 1.
[ [x isNil] whileFalse: [
" Try very hard to get x garbage collected:"
x := nil.
x := w at: 1.
] ] forkNamed: 'Bleeper'.! !
More information about the Squeak-dev