Skip to content

Commit

Permalink
Moving newSpace start and end to the memory map
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Jan 20, 2022
1 parent 95447b0 commit a7a767e
Show file tree
Hide file tree
Showing 9 changed files with 95 additions and 74 deletions.
22 changes: 12 additions & 10 deletions smalltalksrc/VMMaker/Spur32BitCoMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ Spur32BitCoMemoryManager >> checkMemoryMap [
Being young would cause them to be scavenged.
Being old would cause them to be remembered if stored into (but wait, they don't get stored into)."

self assert: (self isYoungObject: newSpaceStart).
self assert: (self isYoungObject: newSpaceLimit - self wordSize).
self assert: (self isOldObject: newSpaceStart) not.
self assert: (self isOldObject: newSpaceLimit - self wordSize) not.
self assert: (self isYoungObject: newSpaceLimit) not.
self assert: (self isYoungObject: memoryMap newSpaceStart).
self assert: (self isYoungObject: memoryMap newSpaceEnd - self wordSize).
self assert: (self isOldObject: memoryMap newSpaceStart) not.
self assert: (self isOldObject: memoryMap newSpaceEnd - self wordSize) not.
self assert: (self isYoungObject: memoryMap newSpaceEnd) not.
self assert: (self isYoungObject: memoryMap oldSpaceStart) not.
self assert: (self isYoungObject: memoryMap oldSpaceEnd) not.
self assert: (self isOldObject: memoryMap oldSpaceStart).
Expand Down Expand Up @@ -151,7 +151,9 @@ Spur32BitCoMemoryManager >> headerWhileForwardingOf: aCompiledMethodObjOop [
Spur32BitCoMemoryManager >> initializeFreeSpaceForFacadeFrom: base to: limit [
"c.f. initializeFreeSpacePostLoad: freeListObj."
| freeListObj freeBytes |
memoryMap oldSpaceStart: (newSpaceLimit := freeStart := base).

memoryMap newSpaceEnd: (freeStart := base).
memoryMap oldSpaceStart: memoryMap newSpaceEnd.
memoryMap oldSpaceEnd: limit.

scavengeThreshold := limit * 3 // 4.
Expand Down Expand Up @@ -199,15 +201,15 @@ Spur32BitCoMemoryManager >> isReallyYoungObject: objOop [
<api>
"Answer if obj is young. Require that obj is non-immediate. Override to filter-out Cog methods"
self assert: (self isNonImmediate: objOop).
^(self oop: objOop isLessThan: newSpaceLimit)
and: [self oop: objOop isGreaterThanOrEqualTo: newSpaceStart]
^(self oop: objOop isLessThan: memoryMap newSpaceEnd)
and: [self oop: objOop isGreaterThanOrEqualTo: memoryMap newSpaceStart]
]

{ #category : #compaction }
Spur32BitCoMemoryManager >> methodHeaderFromSavedFirstField: field [
(self isIntegerObject: field) ifTrue:
[^field].
self assert: ((self isNonImmediate: field) and: [field < newSpaceStart]).
self assert: ((self isNonImmediate: field) and: [field < memoryMap newSpaceStart]).
self assert: (coInterpreter cCoerceSimple: field to: #'CogMethod *') objectHeader
= self nullHeaderForMachineCodeMethod.
^(coInterpreter cCoerceSimple: field to: #'CogMethod *') methodHeader
Expand All @@ -226,7 +228,7 @@ Spur32BitCoMemoryManager >> methodHeaderOf: methodObj [
^(self isIntegerObject: header)
ifTrue: [header]
ifFalse:
[self assert: header asUnsignedInteger < newSpaceStart.
[self assert: header asUnsignedInteger < memoryMap newSpaceStart.
self assert: (coInterpreter cCoerceSimple: header to: #'CogMethod *') objectHeader
= self nullHeaderForMachineCodeMethod.
(coInterpreter cCoerceSimple: header to: #'CogMethod *') methodHeader]
Expand Down
21 changes: 11 additions & 10 deletions smalltalksrc/VMMaker/Spur64BitCoMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ Spur64BitCoMemoryManager >> checkMemoryMap [
Being young would cause them to be scavenged.
Being old would cause them to be remembered if stored into (but wait, they don't get stored into)."

self assert: (self isYoungObject: newSpaceStart).
self assert: (self isYoungObject: newSpaceLimit - self wordSize).
self assert: (self isOldObject: newSpaceStart) not.
self assert: (self isOldObject: newSpaceLimit - self wordSize) not.
self assert: (self isYoungObject: newSpaceLimit) not.
self assert: (self isYoungObject: memoryMap newSpaceStart).
self assert: (self isYoungObject: memoryMap newSpaceEnd - self wordSize).
self assert: (self isOldObject: memoryMap newSpaceStart) not.
self assert: (self isOldObject: memoryMap newSpaceEnd - self wordSize) not.
self assert: (self isYoungObject: memoryMap newSpaceEnd) not.
self assert: (self isYoungObject: memoryMap oldSpaceStart) not.
self assert: (self isYoungObject: memoryMap oldSpaceEnd) not.
self assert: (self isOldObject: memoryMap oldSpaceStart).
Expand Down Expand Up @@ -158,7 +158,8 @@ Spur64BitCoMemoryManager >> headerWhileForwardingOf: aCompiledMethodObjOop [
Spur64BitCoMemoryManager >> initializeFreeSpaceForFacadeFrom: base to: limit [
"c.f. initializeFreeSpacePostLoad: freeListObj."
| freeListObj freeBytes |
memoryMap oldSpaceStart: (newSpaceLimit := freeStart := base).
memoryMap newSpaceEnd: (freeStart := base).
memoryMap oldSpaceStart: memoryMap newSpaceEnd.
memoryMap oldSpaceEnd: limit.
scavengeThreshold := limit * 3 // 4.
segmentManager initSegmentForInImageCompilationFrom: base to: limit.
Expand Down Expand Up @@ -205,15 +206,15 @@ Spur64BitCoMemoryManager >> isReallyYoungObject: objOop [
<api>
"Answer if obj is young. Require that obj is non-immediate. Override to filter-out Cog methods"
self assert: (self isNonImmediate: objOop).
^(self oop: objOop isLessThan: newSpaceLimit)
and: [self oop: objOop isGreaterThanOrEqualTo: newSpaceStart]
^(self oop: objOop isLessThan: memoryMap newSpaceEnd)
and: [self oop: objOop isGreaterThanOrEqualTo: memoryMap newSpaceStart]
]

{ #category : #compaction }
Spur64BitCoMemoryManager >> methodHeaderFromSavedFirstField: field [
(self isIntegerObject: field) ifTrue:
[^field].
self assert: ((self isNonImmediate: field) and: [field < newSpaceStart]).
self assert: ((self isNonImmediate: field) and: [field < memoryMap newSpaceStart]).
self assert: (coInterpreter cCoerceSimple: field to: #'CogMethod *') objectHeader
= self nullHeaderForMachineCodeMethod.
^(coInterpreter cCoerceSimple: field to: #'CogMethod *') methodHeader
Expand All @@ -232,7 +233,7 @@ Spur64BitCoMemoryManager >> methodHeaderOf: methodObj [
^(self isIntegerObject: header)
ifTrue: [header]
ifFalse:
[self assert: header asUnsignedInteger < newSpaceStart.
[self assert: header asUnsignedInteger < memoryMap newSpaceStart.
self assert: (coInterpreter cCoerceSimple: header to: #'CogMethod *') objectHeader
= self nullHeaderForMachineCodeMethod.
(coInterpreter cCoerceSimple: header to: #'CogMethod *') methodHeader]
Expand Down
4 changes: 2 additions & 2 deletions smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ SpurGenerationScavenger >> corpseForCorpseOffset: corpseOffset [
non-future newSpace and use this to implement lists for weak array and
ephemeron processing. 27 bits of 8 byte allocationUnits units is 2 ^ 30
bytes, or 1Gb, big enough for newSpace for a good few years yet."
^corpseOffset - 1 << manager shiftForAllocationUnit + manager newSpaceStart
^corpseOffset - 1 << manager shiftForAllocationUnit + manager getMemoryMap newSpaceStart
]

{ #category : #'weakness and ephemerality' }
Expand All @@ -411,7 +411,7 @@ SpurGenerationScavenger >> corpseOffsetOf: corpse [
bytes or 1Gb, big enough for newSpace for a good few years yet. Add
one to ensure that a corpse offset is always non-zero, even when it is
that of the first object in newSpace."
^corpse - manager newSpaceStart >> manager shiftForAllocationUnit + 1
^corpse - manager getMemoryMap newSpaceStart >> manager shiftForAllocationUnit + 1
]

{ #category : #accessing }
Expand Down
80 changes: 36 additions & 44 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -551,8 +551,6 @@ Class {
'memoryMap',
'freeOldSpaceStart',
'scavengeThreshold',
'newSpaceStart',
'newSpaceLimit',
'edenBytes',
'nilObj',
'falseObj',
Expand Down Expand Up @@ -710,7 +708,7 @@ SpurMemoryManager class >> compactorClass [

{ #category : #translation }
SpurMemoryManager class >> declareCVarsIn: aCCodeGenerator [
self declareCAsOop: #(freeStart scavengeThreshold newSpaceStart newSpaceLimit pastSpaceStart
self declareCAsOop: #(freeStart scavengeThreshold pastSpaceStart
lowSpaceThreshold freeOldSpaceStart)
in: aCCodeGenerator.
self declareCAsUSqLong: (self allInstVarNames select: [:ivn| ivn endsWith: 'Usecs']), #(statAllocatedBytes)
Expand Down Expand Up @@ -2015,16 +2013,19 @@ SpurMemoryManager >> allocateMemoryOfSize: memoryBytes newSpaceSize: newSpaceByt
self assert: allocatedAddress = initialAddress.
newSpaceStart := initialAddress + newSpaceStartOffset.
memoryMap newSpaceStart: initialAddress + newSpaceStartOffset.
memoryMap oldSpaceEnd: (freeOldSpaceStart := initialAddress + allocatedMemory).
"leave newSpace empty for the bootstrap"
freeStart := newSpaceBytes + newSpaceStart.
memoryMap oldSpaceStart: (newSpaceLimit := newSpaceBytes + newSpaceStart).
freeStart := newSpaceBytes + memoryMap newSpaceStart.
memoryMap newSpaceEnd: newSpaceBytes + memoryMap newSpaceStart.
memoryMap oldSpaceStart: memoryMap newSpaceEnd.
scavengeThreshold := allocatedMemory. "i.e. /don't/ scavenge."
scavenger := SpurGenerationScavenger simulatorClass new.
scavenger manager: self.
scavenger
newSpaceStart: newSpaceStart
newSpaceStart: memoryMap newSpaceStart
newSpaceBytes: newSpaceBytes
survivorBytes: newSpaceBytes // self scavengerDenominator.
compactor := self class compactorClass simulatorClass new
Expand Down Expand Up @@ -2992,15 +2993,15 @@ SpurMemoryManager >> characterValueOf: oop [
{ #category : #'debug support' }
SpurMemoryManager >> cheapAddressCouldBeInHeap: address [
^(address bitAnd: self wordSize - 1) = 0
and: [(self oop: address isGreaterThanOrEqualTo: newSpaceStart)
and: [(self oop: address isGreaterThanOrEqualTo: memoryMap newSpaceStart)
and: [self oop: address isLessThan: memoryMap oldSpaceEnd]]
]
{ #category : #'plugin support' }
SpurMemoryManager >> cheapIsInMemory: address [
"Answer if the given address is in ST object memory. For simulation only."
<doNotGenerate>
^address >= newSpaceStart and: [address < memoryMap oldSpaceEnd]
^address >= memoryMap newSpaceStart and: [address < memoryMap oldSpaceEnd]
]
{ #category : #allocation }
Expand Down Expand Up @@ -3373,14 +3374,14 @@ SpurMemoryManager >> checkHeapIntegrity: excludeUnmarkedObjs classIndicesShouldB
{ #category : #'debug support' }
SpurMemoryManager >> checkMemoryMap [
self assert: (self isYoungObject: newSpaceStart).
self assert: (self isYoungObject: newSpaceLimit - self wordSize).
self assert: (self isOldObject: newSpaceStart) not.
self assert: (self isOldObject: newSpaceLimit - self wordSize) not.
self assert: (self isYoungObject: newSpaceLimit) not.
self assert: (self isYoungObject: memoryMap newSpaceStart).
self assert: (self isYoungObject: memoryMap newSpaceEnd - self wordSize).
self assert: (self isOldObject: memoryMap newSpaceStart) not.
self assert: (self isOldObject: memoryMap newSpaceEnd - self wordSize) not.
self assert: (self isYoungObject: memoryMap newSpaceEnd) not.
self assert: (self isYoungObject: memoryMap oldSpaceStart) not.
self assert: (self isYoungObject: memoryMap oldSpaceEnd) not.
self assert: (self isOldObject: newSpaceLimit).
self assert: (self isOldObject: memoryMap newSpaceEnd).
self assert: (self isOldObject: memoryMap oldSpaceStart).
self assert: (self isOldObject: memoryMap oldSpaceEnd)
]
Expand Down Expand Up @@ -3434,7 +3435,7 @@ SpurMemoryManager >> checkOkayYoungReferrer: obj [
is in remembered set. Answer true if OK. Otherwise print reason and answer false.
Assumes the object contains young references."
(self oop: obj isLessThan: newSpaceLimit) ifTrue:
(self oop: obj isLessThan: memoryMap newSpaceEnd) ifTrue:
[^true].
(self isRemembered: obj) ifFalse:
Expand Down Expand Up @@ -5116,7 +5117,7 @@ SpurMemoryManager >> flushNewSpace [
threshold above everything in newSpace, i.e. newSpaceLimit."
| savedTenuringThreshold |
savedTenuringThreshold := scavenger getRawTenuringThreshold.
scavenger setRawTenuringThreshold: newSpaceLimit.
scavenger setRawTenuringThreshold: memoryMap newSpaceEnd.
self scavengingGCTenuringIf: TenureByAge.
scavenger setRawTenuringThreshold: savedTenuringThreshold.
self assert: scavenger rememberedSetSize = 0.
Expand Down Expand Up @@ -6412,8 +6413,9 @@ SpurMemoryManager >> initializeNewSpaceVariables [
scavengeThreshold := scavenger eden limit
- (scavenger edenBytes // 64)
- coInterpreter interpreterAllocationReserveBytes.
newSpaceStart := scavenger pastSpace start min: scavenger futureSpace start.
self assert: newSpaceStart < scavenger eden start.
memoryMap newSpaceStart: (scavenger pastSpace start min: scavenger futureSpace start).
self assert: memoryMap newSpaceStart < scavenger eden start.
self initSpaceForAllocationCheck: (self addressOf: scavenger eden) limit: scavengeThreshold
]
Expand Down Expand Up @@ -7096,8 +7098,8 @@ SpurMemoryManager >> isInMemory: address [
{ #category : #'object testing' }
SpurMemoryManager >> isInNewSpace: objOop [
^(self oop: objOop isLessThan: newSpaceLimit)
and: [self oop: objOop isGreaterThanOrEqualTo: newSpaceStart]
^(self oop: objOop isLessThan: memoryMap newSpaceEnd)
and: [self oop: objOop isGreaterThanOrEqualTo: memoryMap newSpaceStart]
]
{ #category : #'object testing' }
Expand Down Expand Up @@ -7649,15 +7651,15 @@ SpurMemoryManager >> isYoung: oop [
<api>
"Answer if oop is young."
^(self isNonImmediate: oop)
and: [self oop: oop isLessThan: newSpaceLimit]
and: [self oop: oop isLessThan: memoryMap newSpaceEnd]
]
{ #category : #'object testing' }
SpurMemoryManager >> isYoungObject: objOop [
<api>
"Answer if obj is young. Require that obj is non-immediate."
self assert: (self isNonImmediate: objOop).
^self oop: objOop isLessThan: newSpaceLimit
^self oop: objOop isLessThan: memoryMap newSpaceEnd
]
{ #category : #'object access' }
Expand Down Expand Up @@ -8789,12 +8791,6 @@ SpurMemoryManager >> newSpaceIsEmpty [
and: [pastSpaceStart = scavenger pastSpace start]
]
{ #category : #accessing }
SpurMemoryManager >> newSpaceLimit [
<cmacro: '() GIV(newSpaceLimit)'>
^newSpaceLimit
]
{ #category : #'gc - scavenging' }
SpurMemoryManager >> newSpaceRefCountMask [
"The three bit field { isGrey, isPinned, isRemembered } is for bits
Expand All @@ -8813,11 +8809,6 @@ SpurMemoryManager >> newSpaceSize [
+ (pastSpaceStart - scavenger pastSpace start)
]
{ #category : #accessing }
SpurMemoryManager >> newSpaceStart [
^newSpaceStart
]
{ #category : #'primitive support' }
SpurMemoryManager >> nilFieldsOf: obj [
0 to: (self numSlotsOf: obj) - 1 do:
Expand Down Expand Up @@ -9295,7 +9286,7 @@ SpurMemoryManager >> objectAfter: objOop [
an object doesn't have a saturated size field it must be a single-header object. If the word following
does have a saturated slotSize it must be the overflow size word."
<inline: false>
(self oop: objOop isLessThan: newSpaceLimit) ifTrue:
(self oop: objOop isLessThan: memoryMap newSpaceEnd) ifTrue:
[(self isInEden: objOop) ifTrue:
[^self objectAfter: objOop limit: freeStart].
(self isInPastSpace: objOop) ifTrue:
Expand All @@ -9319,7 +9310,7 @@ SpurMemoryManager >> objectBefore: objOop [
<api>
| prev |
prev := nil.
(self oop: objOop isLessThan: newSpaceLimit) ifTrue:
(self oop: objOop isLessThan: memoryMap newSpaceEnd) ifTrue:
[self allNewSpaceEntitiesDo:
[:o|
(self oop: o isGreaterThanOrEqualTo: objOop) ifTrue:
Expand Down Expand Up @@ -10812,7 +10803,7 @@ SpurMemoryManager >> scavengingGCTenuringIf: tenuringCriterion [
preGCAction: GCModeNewSpace;
"would prefer this to be in mapInterpreterOops, but
compatibility with ObjectMemory dictates it goes here."
flushMethodCacheFrom: newSpaceStart to: newSpaceLimit.
flushMethodCacheFrom: memoryMap newSpaceStart to: memoryMap newSpaceEnd.
needGCFlag := false.
gcStartUsecs := coInterpreter ioUTCMicrosecondsNow.
Expand Down Expand Up @@ -10961,16 +10952,17 @@ SpurMemoryManager >> setHeapBase: baseOfHeap memoryLimit: memLimit endOfMemory:
<inline: #never>
| reserve |
reserve := coInterpreter interpreterAllocationReserveBytes.
newSpaceStart := baseOfHeap.
newSpaceLimit := baseOfHeap + edenBytes + reserve.
scavenger newSpaceStart: newSpaceStart
newSpaceBytes: newSpaceLimit - newSpaceStart
survivorBytes: newSpaceLimit - newSpaceStart - reserve // self scavengerDenominator.
memoryMap newSpaceStart: baseOfHeap.
memoryMap newSpaceEnd: baseOfHeap + edenBytes + reserve.
scavenger newSpaceStart: memoryMap newSpaceStart
newSpaceBytes: memoryMap newSpaceEnd - memoryMap newSpaceStart
survivorBytes: memoryMap newSpaceEnd - memoryMap newSpaceStart - reserve // self scavengerDenominator.
freeStart := scavenger eden start.
pastSpaceStart := scavenger pastSpace start.
memoryMap oldSpaceStart: newSpaceLimit.
memoryMap oldSpaceStart: memoryMap newSpaceEnd.
freeOldSpaceStart := memEnd.
memoryMap oldSpaceEnd: memLimit.
Expand Down Expand Up @@ -11692,7 +11684,7 @@ SpurMemoryManager >> storeByte: byteIndex ofObject: oop withValue: valueByte [
SpurMemoryManager >> storeCheckBoundary [
"A renaming for the Cogit, which couldn't make sense of GIV(newSpaceLimit)"
<api>
^newSpaceLimit
^memoryMap newSpaceEnd
]
{ #category : #'simulation only' }
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/SpurSegmentManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ SpurSegmentManager >> initializeFromFreeChunks: freeChunks [
[:i| | bridge start size |
bridge := freeChunks at: i.
start := i = 1
ifTrue: [manager newSpaceLimit]
ifTrue: [manager getMemoryMap newSpaceEnd]
ifFalse: [manager addressAfter: (freeChunks at: i - 1)].
size := bridge + manager baseHeaderSize - start.
SpurSegmentInfo new
Expand Down

0 comments on commit a7a767e

Please sign in to comment.