[prev in list] [next in list] [prev in thread] [next in thread]
List: squeak-vm-dev
Subject: [Vm-dev] VM Maker: VMMaker-dtl.407.mcz
From: commits () source ! squeak ! org
Date: 2020-01-30 1:04:07
Message-ID: E1iwyFg-0004eh-L7 () andreas
[Download RAW message or body]
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'!
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic