VM Maker: VMMaker-dtl.407.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker-dtl.407.mcz

commits-2
 
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'!