[squeak-dev] flushCache
Eliot Miranda
eliot.miranda at gmail.com
Mon Nov 3 22:11:19 UTC 2014
On Mon, Nov 3, 2014 at 2:04 PM, Levente Uzonyi <leves at elte.hu> wrote:
> On Mon, 3 Nov 2014, Nicolas Cellier wrote:
>
> I think Eliot already explained this in this vm-dev thread
>> [Vm-dev] About primitive for cleaning compiled method cache
>> http://lists.squeakfoundation.org/pipermail/vm-dev/2013-March/012333.html
>>
>
> Thanks Eliot and Nicolas. So IUUC we don't have to use primitive 116 from
> Behavior >> #basicAddSelector:withMethod: and Behavior >>
> #basicRemoveSelector:
> anymore. Is that right?
>
Right. I think it's bogus. Just 119.
I took a quick look at the implementation of the MethodCache, and I was
> wondering why is the probe loop unrolled by hand in
> #lookupInMethodCacheSel:class(Tag):. This makes it hard to change the
> number of probes, and I assume that the C compiler would be able to unroll
> it just as well.
It was ever that way. I could fix it I suppose. But it needs to be
unrolled in the JIT's open PIC implementation anyway...
Levente
>
>
>
>> 2014-11-03 19:42 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com>:
>>
>>
>> On Mon, Nov 3, 2014 at 10:32 AM, Levente Uzonyi <leves at elte.hu>
>> wrote:
>> Hi All,
>>
>> We have three primitives for three different versions of
>> #flushCache:
>> - primitive 89 used by Behavior >> #flushCache
>> - primitive 116 used by CompiledMethod >> #flushCache
>> - primitive 119 used by Symbol >> #flushCache
>>
>> Based on the comment in CompiledMethod >> #flushCache, and
>> Symbol >> #flushCache, primitive 119 is not used since Squeak
>> 2.3, and Symbol >> #flushCache can safely be removed.
>>
>>
>> NO!!! This is completely wrong. Symbol>>#flushCache is the one that
>> *must* be there. The use of 116 is IMO completely bogus. For the VM
>> to use 116 effectively it must be able to find the selector in the
>> method; in general not possible because the selector is only optional in
>> a method, optionally in the penultimate literal, but perhaps inside the
>> penultimate literal, and perhaps the method is an anonymous accessor
>> only copied into a method dictionary.
>> Caches in the VM are based on *selectors* (arguably these may not even be
>> symbols; see below) and flushing entries that refer to a
>> particular compiled method may not correctly update caches on subclass or
>> superclass methods. Whereas flushing based on selector, even if
>> it does more work, always reliably upates caches correctly.
>>
>> In general message selectors can be any object, so one could aggressively
>> shrink by e.g. replacing all selectors by SmallIntegers. This was
>> done back in the day with the ActiveBook system, an early tablet
>> implemented largely in Smalltalk. So primitive 119 should IMO be
>> implemented in Object.
>>
>> But the method is still in the image, and it is being sent whenever
>> a method is removed or added to a class.
>> Is the comment wrong, or the method is really not needed?
>>
>>
>> The comment is wrong.
>>
>> Also the last comments in Behavior >> #basicAddSelector:withMethod:
>> and Behavior >> #basicRemoveSelector: suggest that either
>> the method's or the selector's cache should be flushed, but not
>> both, which is actually the case in both methods.
>> The comment in Symbol >> #flushCache suggests the same. So what's
>> the truth? Do we still need primitive 119?
>>
>>
>> Yes, we do, and only it should be used in Behavior >>
>> #basicAddSelector:withMethod: and Behavior >> #basicRemoveSelector:.
>>
>>
>>
>> Levente
>>
>>
>>
>>
>> --
>> best,Eliot
>>
>>
>>
>>
>>
>>
>
>
>
--
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20141103/68b79b49/attachment.htm
More information about the Squeak-dev
mailing list
|