David T. Lewis uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker-dtl.407.mcz ==================== Summary ==================== Name: VMMaker-dtl.407 Author: dtl Time: 30 November 2019, 3:09:22.384 pm UUID: 190f79b2-f9f4-4585-9010-4db1afe51481 Ancestors: VMMaker-dtl.406 VMMaker 4.17.1 Implement ContextInterpreter>>primitiveResumeFromSnapshot. This primitive discards the current object memory and resumes interpreter execution in the provided snapshot. Use primitiveMemorySnapshotBytesWithHeader or primitiveMemorySnapshotWithHeader to obtain a snapshot object within a running image, and primitveResumeFromSnapshot to resume into a snapshot object from a sacrificial donor image. For supporting code see www.squeaksource.com/ImageSnapshot and package ImageFormat in the source.squeak.org/VMMaker repository. =============== Diff against VMMaker-dtl.406 =============== Item was added: + ----- Method: ContextInterpreter>>primitiveResumeFromSnapshot (in category 'snapshot utility primitives') ----- + primitiveResumeFromSnapshot + "Discard the current object memory and resume interpreter execution + in the provided snapshot." + + <export: true> + | expectedArraySize snapshotValues size newMemoryBytesOrBitmap bigEndian snapshotImageFormat snapshotStartOfMemory snapshotSpecialObjectsOop snapshotLastHash screenSizePoint headerSize imageBytes imageHeaderFlags snapshotExtraVMMemory swapBytes snapshotFullScreen defaultHeapSize desiredHeapSize | + expectedArraySize := 11. "ImageSnapshot new asValues size => 11" + argumentCount == 1 + ifFalse: [ ^self primitiveFailFor: PrimErrBadNumArgs]. + snapshotValues := self stackObjectValue: 0. + self assertClassOf: snapshotValues is: (objectMemory splObj: ClassArray). + self successful + ifFalse: [ ^self primitiveFailFor: PrimErrBadArgument]. + size := objectMemory numSlotsOf: snapshotValues. + size < expectedArraySize ifTrue: [ ^self primitiveFailFor: PrimErrBadArgument]. + newMemoryBytesOrBitmap := objectMemory fetchPointer: 0 ofObject: snapshotValues. + bigEndian := (objectMemory fetchPointer: 1 ofObject: snapshotValues) = objectMemory trueObject. + snapshotImageFormat := objectMemory integerValueOf: (objectMemory fetchPointer: 2 ofObject: snapshotValues).. + headerSize := objectMemory integerValueOf: (objectMemory fetchPointer: 3 ofObject: snapshotValues).. + imageBytes := self positive32BitValueOf: (objectMemory fetchPointer: 4 ofObject: snapshotValues).. "good for up to 2GB image" + snapshotStartOfMemory := objectMemory integerValueOf: (objectMemory fetchPointer: 5 ofObject: snapshotValues).. + snapshotSpecialObjectsOop := objectMemory integerValueOf: (objectMemory fetchPointer: 6 ofObject: snapshotValues).. + snapshotLastHash := objectMemory integerValueOf: (objectMemory fetchPointer: 7 ofObject: snapshotValues).. + screenSizePoint := objectMemory fetchPointer: 8 ofObject: snapshotValues.. + self assertClassOf: screenSizePoint is: (objectMemory splObj: ClassPoint). + self successful + ifFalse: [ ^self primitiveFailFor: PrimErrBadArgument]. + imageHeaderFlags := objectMemory integerValueOf: (objectMemory fetchPointer: 9 ofObject: snapshotValues).. + snapshotExtraVMMemory := objectMemory integerValueOf: (objectMemory fetchPointer: 10 ofObject: snapshotValues).. + + swapBytes := bigEndian ~= self isBigEnder. + snapshotFullScreen := false. "FIXME" + + "From sqUnixMain.c + #define DefaultHeapSize 20 + megabytes BEYOND actual image size" + defaultHeapSize := 20 * 1000 * 1000. + desiredHeapSize := defaultHeapSize + imageBytes. + + self + snapshotResume: newMemoryBytesOrBitmap + heapSize: desiredHeapSize + swapBytes: swapBytes + oldBaseAddr: snapshotStartOfMemory + specialObjectsOop: snapshotSpecialObjectsOop + lastHash: snapshotLastHash + savedWindowSize: screenSizePoint + fullScreenFlag: snapshotFullScreen + extraVMMemory: snapshotExtraVMMemory. + + self pop: 1 thenPush: newMemoryBytesOrBitmap. + + ! Item was added: + ----- Method: ContextInterpreter>>snapshotResume:heapSize:swapBytes:oldBaseAddr:specialObjectsOop:lastHash:savedWindowSize:fullScreenFlag:extraVMMemory: (in category 'snapshot utility primitives') ----- + snapshotResume: byteArrayOrBitmap heapSize: desiredHeapSize swapBytes: swapBytes oldBaseAddr: oldBaseAddr specialObjectsOop: specialObjects lastHash: hashValue savedWindowSize: windowSize fullScreenFlag: fullScreen extraVMMemory: extraMemory + "Arrange for the interpreter to resume execution from a snapshot of saved + memory and interpreter state. The current object memory and interpreter state + will be discarded, and the interpreter will resume execution at the point of the + supplied image snapshot. Answer the address of the previous object memory + or nil if this is the first evaluation." + + | dataSize sourceBytes mem | + <returnTypeC: 'usqInt'> + <var: #desiredHeapSize type: 'usqInt'> + <var: #dataSize type: 'size_t '> + <var: #sourceBytes type: 'char *'> + <var: #mem type: 'char *'> + + "Notes - The parameters windowSize, fullScreen and extraMemory are currently + not used when resuming the VM in a new image. The display size and fullscreen + mode are probably best set from the image by calling primitiveSetDisplayMode + prior to primitiveResumeFromSnapshot. The extraMemory parameter is ignored + here because we are simply copying the new object memory over a previously + allocated heap space." + + dataSize := objectMemory byteSizeOf: byteArrayOrBitmap. + sourceBytes := objectMemory firstIndexableField: byteArrayOrBitmap. + objectMemory setSpecialObjectsOop: specialObjects. + objectMemory setLastHash: hashValue. + + "Copy object memory into allocated space" + objectMemory setMemoryLimits: dataSize heapSize: desiredHeapSize. + mem := objectMemory pointerForOop: objectMemory getMemory. + self mem: mem + cp: sourceBytes + y: dataSize. + + self swapBytesAndPrepareToInterpret: swapBytes oldBaseAddr: oldBaseAddr. + self interpret. "Resume interpreter execution in the snapshot." + ! Item was added: + ----- Method: ObjectMemory>>setMemoryLimits:heapSize: (in category 'image save/restore') ----- + setMemoryLimits: dataSize heapSize: heapSize + "Set memory limits, assuming that previously allocated heap space is sufficient. + Use this instead of allocateMemory: dataSize heapSize: desiredHeapSize when + resuming the interpreter in a new inage snapshot using previously allocated + heap memory." + + | minimumMemory | + <var: #heapSize type: 'usqInt'> + <var: #dataSize type: 'size_t '> + + minimumMemory := dataSize + 100000. "need at least 100K of breathing room" + "compare memory requirements with availability". + heapSize < minimumMemory ifTrue: [ "try to make more space" + self growObjectMemory: minimumMemory - heapSize. + heapSize < minimumMemory ifTrue: [ + interpreter insufficientMemorySpecifiedError]]. + self setEndOfMemory: memory + dataSize. + ! Item was changed: ----- Method: VMMaker class>>versionString (in category 'version testing') ----- versionString "VMMaker versionString" + ^'4.17.1'! - ^'4.16.9'! |
Free forum by Nabble | Edit this page |