Skip to content

Commit

Permalink
Having a mark to detect when the perm space is dirty
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Apr 7, 2022
1 parent cbf0bee commit d80e32e
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 27 deletions.
11 changes: 7 additions & 4 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ ComposedImageReader >> readFieldsSTONFrom: file into: aStruct [

<inline: true>
<var: #fieldName declareC: 'char fieldName[255]'>
<var: #fieldValue type: #sqLong>
<var: #fieldValue type: #'long long'>
| fieldName fieldValue |
self simulationOnly: [
fieldName := ValueHolder new.
Expand Down Expand Up @@ -90,6 +90,7 @@ ComposedImageReader >> readHeadSTONFrom: file into: aStruct [
ComposedImageReader >> readHeaderFromImage: imageFileName [

<inline: true>
<var: #imageFileName type: 'char *'>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
<var: #header type: #SpurImageHeaderStruct>
Expand Down Expand Up @@ -177,21 +178,23 @@ ComposedImageReader >> readPermanentSpaceFromImageFile: imageFileName header: aH

| newBase permSpaceMetadata oldBase dataSize bytesRead |

newBase := objectMemory getMemoryMap permSpaceStart.
permSpaceMetadata := self readPermanentSpaceMetadataFromImage: imageFileName.
oldBase := permSpaceMetadata startAddress.
dataSize := permSpaceMetadata dataSize.

newBase ~= oldBase ifTrue: [ interpreter unableToReadImageError ].

(objectMemory getMemoryMap ensureAtLeastPermSpaceOf: dataSize)
ifFalse: [ interpreter error: 'Could not allocate PermSpace' ].

newBase := objectMemory getMemoryMap permSpaceStart.
newBase ~= oldBase ifTrue: [ interpreter unableToReadImageError ].

bytesRead := self
readPermanentSpaceDataFromImage: imageFileName
startingAt: (self pointerForOop: newBase)
bytes: dataSize.

objectMemory setPermSpaceFreeStart: (objectMemory getMemoryMap permSpaceStart + dataSize).

"Check bytes read"
bytesRead ~= dataSize ifTrue: [ interpreter unableToReadImageError ].

Expand Down
4 changes: 4 additions & 0 deletions smalltalksrc/VMMaker/ComposedImageWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ ComposedImageWriter >> writeImageFile: imageFileName fromHeader: header [
{ #category : #'perm - space' }
ComposedImageWriter >> writeImagePermanentSpace: imageFileName [

objectMemory isPermSpaceDirty ifFalse: [ ^ objectMemory totalBytesInPermanentSpace ].

objectMemory setPermSpaceDirty: false.

self writePermanentSpaceMetadata: imageFileName.

^ self writePermanentSpaceData: imageFileName
Expand Down
8 changes: 4 additions & 4 deletions smalltalksrc/VMMaker/ComposedMetadataStruct.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ ComposedMetadataStruct class >> byteSizeForSimulator: aCogit [
ComposedMetadataStruct class >> instVarNamesAndTypesForTranslationDo: aBinaryBlock [
"enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a struct of this type."

<var: #segSize type: #size_t>
<var: #segStart type: #squeakFileOffsetType>
<var: #dataSize type: #size_t>
<var: #startAddress type: #squeakFileOffsetType>

aBinaryBlock
value: 'segSize' value:'size_t';
value: 'segStart' value:'squeakFileOffsetType'.
value: 'dataSize' value:'size_t';
value: 'startAddress' value:'squeakFileOffsetType'.


]
Expand Down
24 changes: 23 additions & 1 deletion smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,8 @@ Class {
'statAllocatedBytes',
'statMaxAllocSegmentTime',
'unscannedEphemeronsQueueInitialSize',
'permSpaceFreeStart'
'permSpaceFreeStart',
'permSpaceDirty'
],
#classVars : [
'BitsPerByte',
Expand Down Expand Up @@ -2505,6 +2506,7 @@ SpurMemoryManager >> allocateSlotsInPermSpace: numSlots bytes: totalBytes format
memoryMap extendPermObjectsSpace
ifFalse: [ ^ nil ] ].
permSpaceDirty := true.
chunk := permSpaceFreeStart.
permSpaceFreeStart := permSpaceFreeStart + totalBytes.
Expand Down Expand Up @@ -6525,6 +6527,8 @@ SpurMemoryManager >> initializeObjectMemory: bytesToShift [
shrinkThreshold := 32*1024*1024. "free space before shrinking"
self setHeapSizeAtPreviousGC.
heapGrowthToSizeGCRatio := 0.333333. "By default GC after scavenge if heap has grown by a third since the last GC"
permSpaceDirty := false.
]
{ #category : #'free space' }
Expand Down Expand Up @@ -7369,6 +7373,12 @@ SpurMemoryManager >> isOopMutable: oop [
and: [(self isImmutable: oop) not]
]
{ #category : #'perm - space' }
SpurMemoryManager >> isPermSpaceDirty [
^ permSpaceDirty
]
{ #category : #'header access' }
SpurMemoryManager >> isPinned: objOop [
<api>
Expand Down Expand Up @@ -11143,6 +11153,18 @@ SpurMemoryManager >> setObjectFree: objOop [
self setFree: objOop
]
{ #category : #'perm - space' }
SpurMemoryManager >> setPermSpaceDirty: aValue [
permSpaceDirty := aValue
]
{ #category : #accessing }
SpurMemoryManager >> setPermSpaceFreeStart: aValue [
permSpaceFreeStart := aValue
]
{ #category : #'word size' }
SpurMemoryManager >> shiftForAllocationUnit [
^3
Expand Down
44 changes: 26 additions & 18 deletions smalltalksrc/VMMaker/VMMemoryMap.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ VMMemoryMap >> allocateOldObjectsSpace [
VMMemoryMap >> allocatePermObjectsSpace [

| minSize |
minSize := minPermSpaceSize max: initialPermSpaceSize.
minSize := self roundToPageSize: (minPermSpaceSize max: initialPermSpaceSize).

minSize = 0 ifTrue: [ ^ self ].

Expand Down Expand Up @@ -213,35 +213,37 @@ VMMemoryMap >> doCheckMemoryMap [
]

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

| requestedSize extendedAddress |
| diff |

anInteger = 0 ifTrue: [ ^ true ].
requestedSize = 0 ifTrue: [ ^ true ].

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

diff := requestedSize - self permSpaceSize.
diff <= 0
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.
^ self extendPermObjectsSpaceBy: diff.
]

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

^ self extendPermObjectsSpaceBy: 10 * 1024 * 1024
]

{ #category : #allocating }
VMMemoryMap >> extendPermObjectsSpaceBy: aSize [

| requestedSize extendedAddress |
requestedSize := 10 * 1024 * 1024.

requestedSize := self roundToPageSize: aSize.

extendedAddress := self
allocateMemory: requestedSize
Expand Down Expand Up @@ -454,6 +456,12 @@ VMMemoryMap >> permSpaceEnd: anInteger [
permSpaceEnd := anInteger
]

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

^ self permSpaceEnd - self permSpaceStart
]

{ #category : #accessing }
VMMemoryMap >> permSpaceStart [
^ permSpaceStart
Expand Down

0 comments on commit d80e32e

Please sign in to comment.