Skip to content

Commit

Permalink
Integrating the writing and reading of permSpace
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Apr 7, 2022
1 parent 843c294 commit cbf0bee
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 24 deletions.
15 changes: 9 additions & 6 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ ComposedImageReader >> readDataFromFileName: fullFileName startingAt: startingAd
sqImageFile: fullFileName
Open: 'rb'.

bytes := self
sq: startingAddress
Image: (self sizeof: #char)
File: bytesToRead
Read: file.
bytesToRead > 0 ifTrue:[
bytes := self
sq: startingAddress
Image: (self sizeof: #char)
File: bytesToRead
Read: file]
ifFalse: [ bytes := 0 ].

self sqImageFileClose: file.

Expand Down Expand Up @@ -182,7 +184,8 @@ ComposedImageReader >> readPermanentSpaceFromImageFile: imageFileName header: aH

newBase ~= oldBase ifTrue: [ interpreter unableToReadImageError ].

"check if permsSpace is allocated"
(objectMemory getMemoryMap ensureAtLeastPermSpaceOf: dataSize)
ifFalse: [ interpreter error: 'Could not allocate PermSpace' ].

bytesRead := self
readPermanentSpaceDataFromImage: imageFileName
Expand Down
7 changes: 5 additions & 2 deletions smalltalksrc/VMMaker/ComposedImageWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@ ComposedImageWriter >> writeDataStatingAt: start withSize: size inFileName: full
dataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

nWritten := self
nWritten := 0.

size > 0 ifTrue:[
nWritten := self
sq: start
Image: 1
File: size
Write: dataFile.
Write: dataFile].

self sqImageFileClose: dataFile.

Expand Down
9 changes: 9 additions & 0 deletions smalltalksrc/VMMaker/SpurImageHeaderStruct.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,15 @@ SpurImageHeaderStruct >> initialSpecialObjectsOop: anObject [
initialSpecialObjectsOop := anObject
]

{ #category : #initialization }
SpurImageHeaderStruct >> initialize [

<doNotGenerate>

super initialize.
swapBytes := 0
]

{ #category : #accessing }
SpurImageHeaderStruct >> oldBaseAddr [

Expand Down
6 changes: 6 additions & 0 deletions smalltalksrc/VMMaker/SpurImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@ SpurImageReader >> readImageNamed: imageName [
self sqImageFileClose: file
]

{ #category : #'perm - space' }
SpurImageReader >> readPermanentSpaceFromImageFile: aZnBufferedReadStream header: aSpurImageHeaderStruct [

^ 0
]

{ #category : #segments }
SpurImageReader >> readSegmentsFromImageFile: f header: aHeader [

Expand Down
3 changes: 3 additions & 0 deletions smalltalksrc/VMMaker/SpurImageWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ SpurImageWriter >> writeImageFile: imageFileName fromHeader: header [
headerStart := 0.
imageHeaderSize := header imageHeaderSize.

objectMemory totalBytesInPermanentSpace = 0
ifFalse: [ ^ self primitiveFail].

self logDebug: 'Writing snapshot file %s' _: imageFileName.

f := self sqImageFile: imageFileName Open: 'wb'.
Expand Down
49 changes: 49 additions & 0 deletions smalltalksrc/VMMaker/VMMemoryMap.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,30 @@ VMMemoryMap >> doCheckMemoryMap [

]

{ #category : #allocating }
VMMemoryMap >> ensureAtLeastPermSpaceOf: anInteger [

| requestedSize extendedAddress |

anInteger = 0 ifTrue: [ ^ true ].

anInteger <= (self permSpaceEnd - self permSpaceStart)
ifTrue: [ ^ true ].

requestedSize := self roundToPageSize: anInteger.

extendedAddress := self
allocateMemory: requestedSize
BaseAddress: self permSpaceEnd.

extendedAddress ~= self permSpaceEnd
ifTrue: [ self logError: 'Could not extend perm space.'. ^ false ].

self permSpaceEnd: self permSpaceEnd + requestedSize.

^ true.
]

{ #category : #allocating }
VMMemoryMap >> extendPermObjectsSpace [

Expand All @@ -231,6 +255,14 @@ VMMemoryMap >> extendPermObjectsSpace [
^ true.
]

{ #category : #simulation }
VMMemoryMap >> getpagesize [

<doNotGenerate>

^ 4096
]

{ #category : #accessing }
VMMemoryMap >> initialCodeZoneSize [

Expand Down Expand Up @@ -434,6 +466,23 @@ VMMemoryMap >> permSpaceStart: anInteger [
permSpaceStart := anInteger
]

{ #category : #utils }
VMMemoryMap >> roundToPageSize: anInteger [

<inline: false>

| pageSize pageMask rounded |

pageSize := self getpagesize.
pageMask := (pageSize - 1) bitInvert64.

rounded := anInteger bitAnd: pageMask.

rounded < anInteger ifTrue: [ rounded := rounded + pageSize ].

^ rounded
]

{ #category : #initialization }
VMMemoryMap >> setOldSpaceEnd: anInteger [

Expand Down
6 changes: 6 additions & 0 deletions smalltalksrc/VMMakerTests/VMAbstractImageFormatTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ Class {
#category : #'VMMakerTests-ImageFormat'
}

{ #category : #accessing }
VMAbstractImageFormatTest >> defaultTimeLimit [

^ 30 seconds
]

{ #category : #tests }
VMAbstractImageFormatTest >> imageFileName [

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ VMImageHeaderWritingTest >> testWritingSTONPermSpace [
expectedPermSpaceMetadata startAddress: interpreter objectMemory getMemoryMap permSpaceStart.
expectedPermSpaceMetadata dataSize: interpreter objectMemory totalBytesInPermanentSpace.

self assert: writtenMetadata equals: (STON toStringPretty: expectedPermSpaceMetadata).
self assert: writtenMetadata equals: (self stonPretty: expectedPermSpaceMetadata).
]

{ #category : #tests }
Expand Down
35 changes: 28 additions & 7 deletions smalltalksrc/VMMakerTests/VMImageReadingTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ VMImageReadingTest >> loadImage [

]

{ #category : #utilities }
VMImageReadingTest >> saveImage [

memory garbageCollectForSnapshot.

self assert: interpreter successful.

super saveImage.
]

{ #category : #initialization }
VMImageReadingTest >> setUp [

Expand All @@ -39,14 +49,7 @@ VMImageReadingTest >> setUp [
memory classByteArray: (self newClassInOldSpaceWithSlots: 0 instSpec: (memory byteFormatForNumBytes: 0)).
memory ensureBehaviorHash: memory classByteArray.

permanentObject := self newPermanentByteObjectOfSize: 14.

memory garbageCollectForSnapshot.

self assert: interpreter successful.

originalNilObjectIdentityHash := memory hashBitsOf: memory nilObject.
originalPermanentObjectIdentityHash := memory hashBitsOf: permanentObject.

]

Expand Down Expand Up @@ -79,6 +82,12 @@ VMImageReadingTest >> testSavedImageSavesObjectFromOldSpace [

{ #category : #tests }
VMImageReadingTest >> testSavedImageSavesObjectFromPermanentSpace [

"Only valid in the new format"
imageWriterClass = SpurImageWriter ifTrue: [ ^ self skip ].

permanentObject := self newPermanentByteObjectOfSize: 14.
originalPermanentObjectIdentityHash := memory hashBitsOf: permanentObject.

self saveImage.
self loadImage.
Expand Down Expand Up @@ -118,3 +127,15 @@ VMImageReadingTest >> testSavingImageWithThreeSegmentsIsCorrectlySqueezed [

self assert: originalObjHash equals: (memory hashBitsOf: newObj).
]

{ #category : #tests }
VMImageReadingTest >> testSavingPermanentSpaceObjectsInSpurFormatFails [

imageWriterClass = SpurImageWriter ifFalse: [ ^ self skip ].

permanentObject := self newPermanentByteObjectOfSize: 14.
originalPermanentObjectIdentityHash := memory hashBitsOf: permanentObject.

self should: [ self saveImage ] raise: PrimitiveFailed

]
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,6 @@ VMSpurInitializedOldSpaceTest >> assertFreeListEmpty: aFreeListOop [
self assert: aFreeListOop equals: 0
]

{ #category : #running }
VMSpurInitializedOldSpaceTest >> configureEnvironmentBuilder [

super configureEnvironmentBuilder.

environmentBuilder permSpaceSize: 10*1024*1024.
]

{ #category : #helpers }
VMSpurInitializedOldSpaceTest >> createEphemeronClass [
ourEphemeronClass := self newObjectWithSlots: 3.
Expand Down

0 comments on commit cbf0bee

Please sign in to comment.