Skip to content

Commit

Permalink
Hi new & old RememberedSets :)
Browse files Browse the repository at this point in the history
  • Loading branch information
PalumboN committed Apr 19, 2022
1 parent 4b6af2f commit 4f6ef2d
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 39 deletions.
7 changes: 6 additions & 1 deletion smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,6 @@ SpurGenerationScavenger >> initialize [
tenureThreshold := 0.
statSurvivorCount := statTenures := 0.
scavengeLogRecord := SpurScavengeLogRecord new.
rememberedSet := SpurRememberedSet new.
]

{ #category : #'remembered set' }
Expand Down Expand Up @@ -963,6 +962,12 @@ SpurGenerationScavenger >> remember: anOop [
rememberedSet remember: anOop
]

{ #category : #accessing }
SpurGenerationScavenger >> rememberedSet: anObject [

rememberedSet := anObject
]

{ #category : #'remembered set' }
SpurGenerationScavenger >> rememberedSetFudge [

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ SpurGenerationScavengerSimulator >> copyAndForwardMourner: survivor [
{ #category : #initialization }
SpurGenerationScavengerSimulator >> manager: aSpurNBitMMXEndianSimulator [
manager := aSpurNBitMMXEndianSimulator.
rememberedSet manager: aSpurNBitMMXEndianSimulator.
aSpurNBitMMXEndianSimulator coInterpreter ifNotNil:
[:coint| coInterpreter := coint]
]
Expand Down
75 changes: 55 additions & 20 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,8 @@ Class {
'unscannedEphemeronsQueueInitialSize',
'permSpaceFreeStart',
'permSpaceDirty',
'oldSpaceRememberedSet'
'oldSpaceRememberedSet',
'newSpaceRememberedSet'
],
#classVars : [
'BitsPerByte',
Expand All @@ -629,15 +630,16 @@ Class {
'MarkStackRecord',
'MarkStackRootIndex',
'MournQueueRootIndex',
'NewRememberedSetRootIndex',
'ObjStackFixedSlots',
'ObjStackFreex',
'ObjStackLimit',
'ObjStackMyx',
'ObjStackNextx',
'ObjStackPageSlots',
'ObjStackTopx',
'OldRememberedSetRootIndex',
'RemapBufferSize',
'RememberedSetRootIndex',
'TopOopBit',
'WeaklingStackRootIndex'
],
Expand Down Expand Up @@ -875,7 +877,8 @@ SpurMemoryManager class >> initialize [
MarkStackRootIndex := self basicNew classTableRootSlots.
WeaklingStackRootIndex := MarkStackRootIndex + 1.
MournQueueRootIndex := MarkStackRootIndex + 2.
RememberedSetRootIndex := MarkStackRootIndex + 3.
NewRememberedSetRootIndex := MarkStackRootIndex + 3.
OldRememberedSetRootIndex := MarkStackRootIndex + 4.
MarkObjectsForEnumerationPrimitives := false.
Expand Down Expand Up @@ -2006,6 +2009,7 @@ SpurMemoryManager >> allocateMemoryOfSize: memoryBytes newSpaceSize: newSpaceByt
scavengeThreshold := allocatedMemory. "i.e. /don't/ scavenge."
scavenger := SpurGenerationScavenger simulatorClass new.
scavenger manager: self.
scavenger rememberedSet: newSpaceRememberedSet.
scavenger
newSpaceStart: memoryMap newSpaceStart
newSpaceBytes: newSpaceBytes
Expand Down Expand Up @@ -6342,10 +6346,12 @@ SpurMemoryManager >> initialize [
unscannedEphemeronsQueueInitialSize := 10000. "10k by default"
"we can initialize things that are virtual in C."
scavenger := SpurGenerationScavenger simulatorClass new manager: self; yourself.
newSpaceRememberedSet := SpurRememberedSet new manager: self; rootIndex: NewRememberedSetRootIndex; yourself.
oldSpaceRememberedSet := SpurRememberedSet new manager: self; rootIndex: OldRememberedSetRootIndex; yourself.
scavenger := SpurGenerationScavenger simulatorClass new manager: self; rememberedSet: newSpaceRememberedSet; yourself.
segmentManager := SpurSegmentManager simulatorClass new manager: self; yourself.
compactor := self class compactorClass simulatorClass new manager: self; yourself.
oldSpaceRememberedSet := SpurRememberedSet new manager: self; yourself.
"We can also initialize here anything that is only for simulation."
heapMap := CogCheck32BitHeapMap new.
Expand Down Expand Up @@ -7349,6 +7355,13 @@ SpurMemoryManager >> isObjImmutable: anOop [
ifFalse: [false]
]
{ #category : #'object testing' }
SpurMemoryManager >> isOld: oop [
<api>
^ (self isNonImmediate: oop) and: [ memoryMap isOldObject: oop ]
]
{ #category : #'object testing' }
SpurMemoryManager >> isOopCompiledMethod: oop [
"Answer whether the oop is an object of compiled method format"
Expand Down Expand Up @@ -7383,6 +7396,13 @@ SpurMemoryManager >> isPermSpaceDirty [
^ permSpaceDirty
]
{ #category : #'object testing' }
SpurMemoryManager >> isPermanent: oop [
<api>
^ (self isNonImmediate: oop) and: [ memoryMap isPermanentObject: oop ]
]
{ #category : #'header access' }
SpurMemoryManager >> isPinned: objOop [
<api>
Expand Down Expand Up @@ -8120,11 +8140,10 @@ SpurMemoryManager >> markAndShouldScan: objOop [
(self isMarked: objOop) ifTrue:
[^false].
"If it is a permanent object I will not visit it"
"If it is a permanent object I will not mark it"
(memoryMap isPermanentObject: objOop)
ifTrue: [ ^false ].
self setIsMarkedOf: objOop to: true.
ifFalse: [ self setIsMarkedOf: objOop to: true ].
format := self formatOf: objOop.
(self isPureBitsFormat: format) ifTrue: "avoid pushing non-pointer objects on the markStack."
["Avoid tracing classes of non-objects on the heap, e.g. IRC caches, Sista counters."
Expand Down Expand Up @@ -8209,8 +8228,9 @@ SpurMemoryManager >> markAndTraceHiddenRoots [
self markAndTraceObjStack: markStack andContents: false.
self markAndTraceObjStack: weaklingStack andContents: false.
self markAndTraceObjStack: mournQueue andContents: true.
self markAndTraceRememberedSet: oldSpaceRememberedSet.
self setIsMarkedOf: self rememberedSetObj to: true.
self setIsMarkedOf: self newRememberedSetObj to: true.
self setIsMarkedOf: self freeListsObj to: true.
(self isWeakNonImm: classTableFirstPage) ifTrue:
Expand Down Expand Up @@ -8254,6 +8274,16 @@ SpurMemoryManager >> markAndTraceObjStack: stackOrNil andContents: markAndTraceC
index := index - 1]
]
{ #category : #'obj stack' }
SpurMemoryManager >> markAndTraceRememberedSet: aRememberedSet [
| rememberedSetOop |
rememberedSetOop := aRememberedSet objectOop.
self setIsMarkedOf: rememberedSetOop to: true.
aRememberedSet rememberedSetWithIndexDo: [ :objOop :i |
self markAndTrace: objOop ]
]
{ #category : #'weakness and ephemerality' }
SpurMemoryManager >> markAndTraceWeaklingsFrom: startIndex [
"Mark weaklings on the weaklingStack, ignoring startIndex
Expand Down Expand Up @@ -8865,6 +8895,11 @@ SpurMemoryManager >> newObjectWithSlots: slots format: aFormat classIndex: anInd
^ oop
]
{ #category : #scavenger }
SpurMemoryManager >> newRememberedSetObj [
^self fetchPointer: NewRememberedSetRootIndex ofObject: hiddenRootsObj
]
{ #category : #accessing }
SpurMemoryManager >> newSpaceBytes [
^edenBytes
Expand Down Expand Up @@ -9517,6 +9552,11 @@ SpurMemoryManager >> oldRawNumSlotsOf: objOop [
^self subclassResponsibility
]
{ #category : #scavenger }
SpurMemoryManager >> oldRememberedSetObj [
^self fetchPointer: OldRememberedSetRootIndex ofObject: hiddenRootsObj
]
{ #category : #'object enumeration' }
SpurMemoryManager >> oldSpaceObjectAfter: objOop [
<api>
Expand Down Expand Up @@ -10705,14 +10745,9 @@ SpurMemoryManager >> rememberedBitShift [
]
{ #category : #scavenger }
SpurMemoryManager >> rememberedSetObj [
^self fetchPointer: RememberedSetRootIndex ofObject: hiddenRootsObj
]
{ #category : #scavenger }
SpurMemoryManager >> rememberedSetObj: anObj [
self assert: (memoryMap isOldObject: anObj).
self storePointerUnchecked: RememberedSetRootIndex ofObject: hiddenRootsObj withValue: anObj
SpurMemoryManager >> rememberedSet: rootIndex oop: anOop [
self assert: (memoryMap isOldObject: anOop).
self storePointerUnchecked: rootIndex ofObject: hiddenRootsObj withValue: anOop
]
{ #category : #'plugin support' }
Expand Down Expand Up @@ -11856,8 +11891,8 @@ SpurMemoryManager >> storePointer: fieldIndex ofObject: objOop withValue: valueP
(self isYoung: valuePointer) ifTrue: [
self possibleRootStoreInto: objOop ] ].
(self getMemoryMap isPermanentObject: objOop) ifTrue: [
(self getMemoryMap isOldObject: valuePointer) ifTrue: [
(self isPermanent: objOop) ifTrue: [
(self isOld: valuePointer) ifTrue: [
self possiblePermStoreInto: objOop ] ].
^ self
Expand Down
10 changes: 5 additions & 5 deletions smalltalksrc/VMMaker/SpurPlanningCompactor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -669,8 +669,8 @@ SpurPlanningCompactor >> remapObj: objOop [
SpurPlanningCompactor >> repinRememberedSet [
<inline: true>
scavenger rememberedSetSize > 0 ifTrue:
[manager storePointerUnchecked: 0 ofObject: manager rememberedSetObj withValue: firstFieldOfRememberedSet].
manager setIsPinnedOf: manager rememberedSetObj to: true.
[manager storePointerUnchecked: 0 ofObject: manager newRememberedSetObj withValue: firstFieldOfRememberedSet].
manager setIsPinnedOf: manager newRememberedSetObj to: true.
scavenger relocateRememberedSet
]
Expand Down Expand Up @@ -806,8 +806,8 @@ SpurPlanningCompactor >> unmarkPinned: pinnedObj [
{ #category : #private }
SpurPlanningCompactor >> unpinRememberedSet [
<inline: true>
firstFieldOfRememberedSet := manager fetchPointer: 0 ofObject: manager rememberedSetObj.
manager setIsPinnedOf: manager rememberedSetObj to: false
firstFieldOfRememberedSet := manager fetchPointer: 0 ofObject: manager newRememberedSetObj.
manager setIsPinnedOf: manager newRememberedSetObj to: false
]
{ #category : #compaction }
Expand Down Expand Up @@ -896,7 +896,7 @@ SpurPlanningCompactor >> updatePointersInManagerHeapEntities [
(scavenger rememberedSetSize > 0
and: [self isMobile: firstFieldOfRememberedSet]) ifTrue:
[firstFieldOfRememberedSet := manager fetchPointer: 0 ofObject: firstFieldOfRememberedSet].
self relocateObjectsInHeapEntity: manager rememberedSetObj from: 1 to: scavenger rememberedSetSize - 1
self relocateObjectsInHeapEntity: manager newRememberedSetObj from: 1 to: scavenger rememberedSetSize - 1
"Note that we /must not/ set the rememberedSetObj here since it is a slot in the hiddenRootsObj
and will be updated normally in updatePointersInInitialImmobileObjects. So do not do
(self isMobile: manager rememberedSetObj) ifTrue:
Expand Down
29 changes: 24 additions & 5 deletions smalltalksrc/VMMaker/SpurRememberedSet.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Class {
#instVars : [
'manager',
'fudge',
'rootIndex',
'rememberedSetSize',
'rememberedSetLimit',
'rememberedSetArray',
Expand Down Expand Up @@ -44,7 +45,7 @@ SpurRememberedSet >> growRememberedSet [
| obj numSlots newObj base |
<inline: false> "Don't ruin locality in remember:"
<var: #base type: #'sqInt *'>
obj := manager rememberedSetObj.
obj := self objectOop.
numSlots := manager numSlotsOf: obj.
self assert: numSlots >= 1024.
newObj := manager allocatePinnedSlots: numSlots * 2.
Expand All @@ -53,7 +54,7 @@ SpurRememberedSet >> growRememberedSet [
newObj ifNil:
[(manager growOldSpaceByAtLeast: numSlots + 1024) ifNil: [self error: 'could not grow remembered set'].
newObj := manager allocatePinnedSlots: numSlots + 1024. "cannot fail"]].
manager rememberedSetObj: newObj.
manager rememberedSet: rootIndex oop: newObj.
base := manager firstIndexableField: newObj.
0 to: rememberedSetSize - 1 do:
[:i| base at: i put: (rememberedSetArray at: i)].
Expand Down Expand Up @@ -86,11 +87,11 @@ SpurRememberedSet >> initialize [
{ #category : #initialization }
SpurRememberedSet >> initializeRememberedSet [
| obj |
obj := manager rememberedSetObj.
obj := self objectOop.
obj = manager nilObject
ifTrue:
[obj := manager allocatePinnedSlots: 1024.
manager rememberedSetObj: obj]
manager rememberedSet: rootIndex oop: obj]
ifFalse: "The Spur32to64BitBootstrap failed to set the type of rememberedSetObj to 64-bit indexability.
This is unimportant except for simulation; rememberedSet is declared as sqInt *, but in to have
firstIndexableField: below answer a suitable type the format must be wordIndexableFormat."
Expand Down Expand Up @@ -157,6 +158,12 @@ SpurRememberedSet >> objectAt: anIndex [
^ rememberedSetArray at: anIndex
]

{ #category : #accessing }
SpurRememberedSet >> objectOop [

^ manager objStackAt: rootIndex
]

{ #category : #accessing }
SpurRememberedSet >> previousRememberedSetSize [
^ previousRememberedSetSize
Expand Down Expand Up @@ -193,7 +200,7 @@ SpurRememberedSet >> referenceCountRememberedReferents: population maxRefCount:
SpurRememberedSet >> relocateRememberedSet [

"For SpurPlanningCompactor"
rememberedSetArray := manager firstIndexableField: manager rememberedSetObj
rememberedSetArray := manager firstIndexableField: self objectOop
]

{ #category : #'store check' }
Expand Down Expand Up @@ -327,6 +334,18 @@ SpurRememberedSet >> replace: oldOop with: newOop [
^ self save: newOop at: index ] ]
]

{ #category : #accessing }
SpurRememberedSet >> rootIndex [

^ rootIndex
]

{ #category : #accessing }
SpurRememberedSet >> rootIndex: anIndex [

rootIndex := anIndex
]

{ #category : #accessing }
SpurRememberedSet >> save: anOop at: index [

Expand Down
34 changes: 33 additions & 1 deletion smalltalksrc/VMMakerTests/VMSpurMemoryManagerTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ VMSpurMemoryManagerTest >> initializeOldSpaceForScavenger [

firstClassTablePage := memory fetchPointer: 0 ofObject: memory hiddenRootsObject.

memory scavenger initializeRememberedSet.
memory newSpaceRememberedSet initializeRememberedSet.
memory oldSpaceRememberedSet initializeRememberedSet.
memory scavenger remember: memory hiddenRootsObject.
memory scavenger remember: firstClassTablePage.
Expand Down Expand Up @@ -428,6 +428,38 @@ VMSpurMemoryManagerTest >> newOldSpaceObjectWithSlots: slots format: aFormat cla
^ oop
]

{ #category : #'helpers - objects' }
VMSpurMemoryManagerTest >> newPermanentObjectWithSlots: slots [

^ self newPermanentSpaceObjectWithSlots: slots classIndex: memory arrayClassIndexPun
]

{ #category : #'helpers - objects' }
VMSpurMemoryManagerTest >> newPermanentSpaceObjectWithSlots: slots classIndex: anIndex [

| format |
format := slots = 0
ifTrue: [ memory zeroSlotsNonIndexablePointerFormat ]
ifFalse: [ memory arrayFormat ].

^ self
newPermanentSpaceObjectWithSlots: slots
format: format
classIndex: anIndex
]

{ #category : #'helpers - objects' }
VMSpurMemoryManagerTest >> newPermanentSpaceObjectWithSlots: slots format: aFormat classIndex: anIndex [

| oop |
oop := memory
allocateSlotsInPermSpace: slots
format: aFormat
classIndex: anIndex.
oop ifNotNil: [ memory fillObj: oop numSlots: slots with: memory nilObject ].
^ oop
]

{ #category : #'helpers - frames' }
VMSpurMemoryManagerTest >> newSmallContextReceiver: anOop method: aMethodOop arguments: aCollectionOfArgumentsOop temporaries: aCollectionOfTemporariesOop ip: anIp [

Expand Down

0 comments on commit 4f6ef2d

Please sign in to comment.