[squeak-dev] More finalization enhancements
Levente Uzonyi
leves at elte.hu
Fri Feb 26 22:31:33 UTC 2010
As you probably noticed, I pushed the changes which implement 2a to the
Trunk. For 1. I uploaded two packages to the Inbox. To try them evaluate
this:
(Installer squeakfoundation project: 'inbox')
install: 'Monticello-ul.372.mcz';
install: 'Monticello-ul.373.mcz'
Levente
On Wed, 24 Feb 2010, Levente Uzonyi wrote:
> I came to the decision that 1. is a bad idea, because currently there is no
> WeakKeyDictionary which has a finalizer, because it's a new feature. This
> means that every WeakKeyDictionary would keep references to the finalizers
> until a rehash, grow or a (lucky) removal happens and that may means "almost
> forever". So the real solution to the slowdown described in 1. is to remove
> the cache of MCMethodDefinition from WeakArray's weakDependents which is safe
> to do IMHO.
>
> I uploaded an example implementation of 2b to the Inbox, you can try it from
> an updated trunk image if you execute this:
>
> (Installer squeakfoundation project: 'inbox')
> install: 'System-ul.263.mcz';
> install: 'Collections-ul.318.mcz';
> install: 'CollectionsTests-ul.148.mcz'
>
>
> I think we can't get much better finalization performance/features without VM
> support if 2. gets into the Trunk in some form, so I'm going to focus on
> Streams again.
>
> My short term plan is to rewrite all methods which send #*FileNamed: and
> #close to FileStream (or a subclass) to use the #*FileNamed:do: method. This
> is better since it ensures that the file is always closed and it's closed at
> the right time. This will cause changes in a lot of packages.
> If that's done, I'll try to refactor the #*FileNamed:do: methods to open and
> close the file without registering it to the finalization registry. This way
> opening and closing files will cost less if they are used in a limited scope.
> If that's done too, I'll try to speed up file opening/closing even more. This
> involves changes of TextConverter and String too.
> If that's all done, we may use readonly copies of the source files instead of
> shared globals without much slowdown.
>
> In the meantime I'm still working on the method trailer refactorings so
> accessing source files will be even faster.
>
>
> Levente
>
> On Mon, 22 Feb 2010, Levente Uzonyi wrote:
>
>> Hi,
>>
>> I have two other ideas to enhance finalization:
>> 1. If WeakKeyDictionary's finalizer is nil, then #finalizeValues can return
>> immediately, because if finalizer is nil, we just have to throw away the
>> associations which key became nil. The suggested change postpones the
>> removal of elements from the dictionary until rehash, grow or a (lucky)
>> removal happens. It can save a lot of time if there are large
>> WeakKeyDictionaries around (which can easily happen if you load Monticello
>> packages).
>> 2. There should be a way to add multiple finalizers for a single object.
>> Currently if you send #toFinalizeSend:to:with: to an object, it creates an
>> ObjectFinalizer and adds it to the current finalization registry. If you
>> send it one more time to the same object, the first finalizer will be lost.
>> I see two possible solutions:
>> (a) change WeakRegistry to store multiple finalizers per object
>> (b) same as (a), but in a subclass of WeakRegistry and Object >>
>> #finalizationRegistry returns and instance of this subclass
>>
>> Ideas? Opinions?
>>
>>
>> Cheers,
>> Levente
>>
>>
>
>
More information about the Squeak-dev
mailing list
|