[Vm-dev] Root bit on active context? Closure VMs and thoughts on flushExternalPrimitives.

Eliot Miranda eliot.miranda at gmail.com
Mon Apr 13 21:09:37 UTC 2009


On Mon, Apr 13, 2009 at 2:08 PM, Eliot Miranda <eliot.miranda at gmail.com>wrote:

>
>
> On Sat, Apr 11, 2009 at 11:55 PM, John M McIntosh <
> johnmci at smalltalkconsulting.com> wrote:
>
>>
>> Ok, I'm confused about the comments in initialCleanup, since in testing
>> with a Pharo image from feb it DOES call the flushExternalPrimitives, but
>> the comments imply a 3.8 or later image shouldn't have the root bit set.
>>
>> Also then the flushExternalPrimitiveOf: seems to be invoked by the
>> snapshotCleanUp.
>>
>> So is the comment in initialCleanup wrong?
>>
>> Could in the Closure VM could we skip flushExternalPrimitives for the new
>> image type, since we *know* any closure image would have been processed by
>> snapshotCleanUp, versus being a 3.2 image?
>>
>
> Good point.  So initialCleanup would then become
>
> flushExternalPrimitives
> self flushMethodCache.
> self flushAtCache.
>  self flushExternalPrimitiveTable
>

Oops; copy paste error.  I meant of course

initialCleanup
self flushMethodCache.
self flushAtCache.
self flushExternalPrimitiveTable


>
>
>> initialCleanup
>>        "Images written by VMs earlier than 3.6/3.7 will wrongly have the
>> root bit set on the active context. Besides clearing the root bit, we treat
>> this as a marker that these images also lack a cleanup of external
>> primitives (which has been introduced at the same time when the root bit
>> problem was fixed). In this case, we merely flush them from here."
>>
>>        ((self longAt: activeContext) bitAnd: RootBit) = 0 ifTrue:[^nil].
>> "root bit is clean"
>>        "Clean root bit of activeContext"
>>        self longAt: activeContext put: ((self longAt: activeContext)
>> bitAnd: AllButRootBit).
>>        "Clean external primitives"
>>        self flushExternalPrimitives.
>>
>>
>> then
>>
>>
>> flushExternalPrimitives
>>        "Flush the references to external functions from plugin
>>        primitives. This will force a reload of those primitives when
>>        accessed next.
>>        Note: We must flush the method cache here so that any
>>        failed primitives are looked up again."
>>        | oop primIdx |
>>        oop := self firstObject.
>>        [self oop: oop isLessThan: endOfMemory]
>>                whileTrue: [(self isFreeObject: oop)
>>                                ifFalse: [(self isCompiledMethod: oop)
>>                                                ifTrue: ["This is a
>> compiled method"
>>                                                        primIdx := self
>> primitiveIndexOf: oop.
>>                                                        primIdx =
>> PrimitiveExternalCallIndex
>>                                                                ifTrue:
>> ["It's primitiveExternalCall"
>>
>>  self flushExternalPrimitiveOf: oop]]].
>>                        oop := self objectAfter: oop].
>>        self flushMethodCache.
>>        self flushObsoleteIndexedPrimitives.
>>        self flushExternalPrimitiveTable
>>
>>
>> snapshotCleanUp
>>        "Clean up right before saving an image, sweeping memory and:
>>        * nilling out all fields of contexts above the stack pointer.
>>        * flushing external primitives
>>        * clearing the root bit of any object in the root table "
>>        | oop header fmt sz |
>>        oop := self firstObject.
>>        [self oop: oop isLessThan: endOfMemory]
>>                whileTrue: [(self isFreeObject: oop)
>>                                ifFalse: [header := self longAt: oop.
>>                                        fmt := header >> 8 bitAnd: 15.
>>                                        "Clean out context"
>>                                        (fmt = 3 and: [self
>> isContextHeader: header])
>>                                                ifTrue: [sz := self
>> sizeBitsOf: oop.
>>                                                        (self
>> lastPointerOf: oop) + BytesPerWord
>>                                                                to: sz -
>> BaseHeaderSize by: BytesPerWord
>>                                                                do: [:i |
>> self longAt: oop + i put: nilObj]].
>>                                        "Clean out external functions"
>>                                        fmt >= 12
>>                                                ifTrue: ["This is a
>> compiled method"
>>                                                        (self
>> primitiveIndexOf: oop) = PrimitiveExternalCallIndex
>>                                                                ifTrue:
>> ["It's primitiveExternalCall"
>>
>>  self flushExternalPrimitiveOf: oop]]].
>>                        oop := self objectAfter: oop].
>>        self clearRootsTable
>>
>>
>> --
>>
>> ===========================================================================
>> John M. McIntosh <johnmci at smalltalkconsulting.com>
>> Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
>>
>> ===========================================================================
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20090413/8ccc4acb/attachment-0001.htm


More information about the Vm-dev mailing list