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

Eliot Miranda eliot.miranda at gmail.com
Mon Apr 13 21:08:29 UTC 2009


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


> 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/b37cf7fe/attachment.htm


More information about the Vm-dev mailing list