[Vm-dev] Fwd: [Pharo-dev] FogBugz (Case [Issue]10840) Collection - WeakSet>>#size utterly broken

Eliot Miranda eliot.miranda at gmail.com
Fri Jun 7 20:00:12 UTC 2013


---------- Forwarded message ----------
From: Eliot Miranda <eliot.miranda at gmail.com>
Date: Fri, Jun 7, 2013 at 12:59 PM
Subject: Re: [Pharo-dev] FogBugz (Case [Issue]10840) Collection -
WeakSet>>#size utterly broken
To: Pharo Development List <pharo-dev at lists.pharo.org>


Oops, I'm soooo stupid :)

Instead, put the count in the finalization loop, and compare against it.
 e.g.

finalizationProcess
[true] whileTrue: [
 WeakFinalizationList initTestPair.
FinalizationSemaphore wait.
>>> FinalizationCount := FinalizationCount + 1.
 FinalizationLock critical: [
WeakFinalizationList checkTestPair.
FinalizationDependents do: [:weakDependent |
 weakDependent ifNotNil: [
[ weakDependent finalizeValues ] on: Exception fork: [:ex | ex pass ] ]]]].

finalizationCount
^FinalizationCount


Set subclass: #WeakSet
instanceVariableNames: 'flag finalizationCount'
 classVariableNames: ''
poolDictionaries: ''
category: 'Collections-Weak'

size
      | newFinalizationCount |
      newFinalizationCount := WeakArray getFinalizationCount.
      newFinalizationCount == finalizationCount ifTrue:
          [^tally].
      tally := self computeActualSIze.
      finalizationCount := newFinalizationCount


On Fri, Jun 7, 2013 at 11:30 AM, Eliot Miranda <eliot.miranda at gmail.com>wrote:

>
>
> On Fri, Jun 7, 2013 at 2:34 AM, Camille Teruel <camille.teruel at gmail.com>wrote:
>
>>  On 7 juin 2013, at 11:19, Pharo Issue Tracker wrote:
>>
>> A FogBugz case was edited by Stephane Ducasse.
>>
>> Case ID:      10840
>> Title:        WeakSet>>#size utterly broken
>> Status:       Resolved (Fix Review Needed)
>> Category:     Bug
>> Project:      Collection
>> Area:         Misc
>> Priority:     3 - Must Fix
>> Milestone:    Pharo3.0: 30/03/2014
>> Assigned To:  Camille Teruel
>>
>> URL:          https://pharo.fogbugz.com/f/cases/10840
>>
>> Last message:
>> Please can you send a mail to the mailing-list so that we all discuss
>> this problems.
>>
>>
>> Hello everyone,
>>
>> WeakSet>>#size is broken as demonstrated by the following snippet:
>>
>> set := WeakSet new.
>> set add: Object new.
>> Smalltalk garbageCollect.
>> set size. "answers 1 instead of 0"
>>
>> That is because a WeakSet has no mean to know when its items get garbage
>> collected, and thus the tally cannot be updated.
>> So we need to override #size in Weak, I propose:
>> size
>> | counter |
>> counter := 0.
>> self do: [ :e | counter := counter + 1 ].
>>  ^ counter
>> But that it rather inefficient for such a simple query.
>> Any proposition?
>>
>
> One way is to add WeakSets to FInalizationDependents and implement
> finalizeValues to update the size.  But that's making work.  A lazy
> solution might be better.
>
> You *could*, I suppose, use the VM's count of the number of incremental
> and full GCs (alas there's no single count).  I think this is too ugly and
> one would need something neater, but it would work like this:
>
> size
>       | newGCCount |
>       newGCCount := self getGCCount.
>       newGCCount == existingGCCount ifTrue:
>           [^tally].
>       tally := self computeActualSIze.
>       existingGCCount := newGCCount
>
> where
>     getGCCount
>         ^(Smalltalk vmParameterAt: 7) + (Smalltalk vmParameterAt: 9)
>
> There are obviously thread-safety issues here, but there are issues with
> the existing code and your suggestion too ;)
>
> The most useful single count here would be a count that was incremented
> once in each GC that finalized one or more references.
>
> Note also that for this to be reliable instances' record of the count
> would have to be invalidated on snapshot or start-up, which could entail an
> expensive allInstancesDo:.
>
> Perhaps the class WeakSet should maintain its instances in (of course) a
> WeakSet and then add only itself to FinalizationDependents and enumerate
> the set on finalization?
>
>
>
> I note that in the VisualWorks VM, objects that have references finalized
> are added to a queue so every instance that loses a reference gets sent
> finalize, instead of only dependents as in Squeak.  This has its won
> problems (the VM must cope with a potentially large list) but I think it
> provides more convenient control.
>
>
>>
>> The bug entry is: https://pharo.fogbugz.com/f/cases/10840
>>
>>
>>
>> If you do not want to receive automatic notifications anymore, change
>> your preferences in the Options screen. (
>> https://pharo.fogbugz.com/default.asp?pg=pgPrefs)
>>
>>
>>
>
>
> --
> best,
> Eliot
>



-- 
best,
Eliot



-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20130607/3f3021e2/attachment.htm


More information about the Vm-dev mailing list