[Vm-dev] #flushCache with MethoWrappers in CogVM

Mariano Martinez Peck marianopeck at gmail.com
Sun Mar 20 16:52:41 UTC 2011


Thanks Eliot. So I assume that the correcet way to implement #flushCache  in
my object as method is this:

MyObjectAsMethod>>flushCache
  <primitive: 116>


thanks Eliot

Mariano

On Sun, Mar 20, 2011 at 5:32 PM, Eliot Miranda <eliot.miranda at gmail.com>wrote:

>
> Hi Mariano,
>
>     VMMaker-oscog.52 is uploading:
>
> primitiveFlushCacheByMethod
> "The receiver is a compiledMethod.  Clear all entries in the method lookup
> cache that
>  refer to this method, presumably because it has been redefined,
> overridden or removed.
>  Override to flush appropriate machine code caches also."
>  | probe oldMethod primIdx |
> oldMethod := self stackTop.
> probe := 0.
>  1 to: MethodCacheEntries do:
> [:i |
> (methodCache at: probe + MethodCacheMethod) = oldMethod ifTrue:
>  [methodCache at: probe + MethodCacheSelector put: 0].
> probe := probe + MethodCacheEntrySize].
>  (objectMemory isOopCompiledMethod: oldMethod) ifTrue:
> [primIdx := self primitiveIndexOf: oldMethod.
>  primIdx = PrimitiveExternalCallIndex ifTrue:
> ["It's primitiveExternalCall"
>  self flushExternalPrimitiveOf: oldMethod].
>  (self methodHasCogMethod: oldMethod) ifTrue:
>  [cogit unlinkSendsTo: (self cogMethodOf: oldMethod)]]
>
> On Wed, Mar 16, 2011 at 3:20 AM, Mariano Martinez Peck <
> marianopeck at gmail.com> wrote:
>
>>
>> Hi Eliot. I am implementing some kind of MethodWrappes/ObjectsAsMethod,
>> whihc basically use the #run:with:in trick.
>> My question is that I am not sure how to implement #flushCache in my
>> wrappers. This method is called by MethodDictionary>>#at:put:  when I want
>> to put back the original CompiledMethod.
>>
>> MyClass methodDict at: #foo put: MyWrapper withMethod: (MyClass>>#foo).
>> ...
>> MyClass methodDict at: #foo put:  wrapper wrappedMethod
>> ->  here it sends #flushCache to my wrapper instance.
>>
>> In the StandardVM, I realised that at that moment, there is an entry in
>> the cache that has selector: #foo, method:  my wrapped instance, class:
>> MyClass, etc...
>>
>> So, to flush this, I have to options:
>>
>> MyWrappers>>flushCache
>> self wrappedMethod selector flushCache
>>
>> or....
>>
>> MyWrappers>>flushCache
>>   <primitive: 116>
>>
>> this is because "self" will be found in the entry as "method" in the cache
>> table...
>>
>> So, first, are my assumptions correct?
>>
>> Now, in cog I am not sure if both solutions are still valid. If I see
>> CoInterpreterPrimitives>> primitiveFlushCacheByMethod
>>
>> you do at the end:
>>
>> (self methodHasCogMethod: oldMethod) ifTrue:
>>         [cogit unlinkSendsTo: (self cogMethodOf: oldMethod)]
>>
>> and
>>
>> methodHasCogMethod: aMethodOop
>>     <api>
>>     self assert: (objectMemory isNonIntegerObject: aMethodOop).
>>     ^self isCogMethodReference: (self rawHeaderOf: aMethodOop)
>>
>>
>> So, it is not safe if the method is something different than a compiled
>> method.
>>
>> Is that correct? should I flush the cache entering by selector instead?
>> which is the safe way to clean the cache in this case?
>>
>> thanks
>>
>> Mariano
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20110320/92948f66/attachment.htm


More information about the Vm-dev mailing list