Skip to content

Commit

Permalink
Merge pull request #621 from tesonep/improving-permSpace-P12
Browse files Browse the repository at this point in the history
Improving perm space p12
  • Loading branch information
tesonep authored Jun 21, 2023
2 parents eb2829c + 81021fa commit cefbe12
Show file tree
Hide file tree
Showing 18 changed files with 672 additions and 232 deletions.
2 changes: 1 addition & 1 deletion cmake/vmmaker.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ if(GENERATE_SOURCES)
message("Defining Windows VM to download for code generation")
set(VMMAKER_VM ${VMMAKER_DIR}/vm/PharoConsole.exe)
set(VM_URL https://files.pharo.org/vm/pharo-spur64-headless/Windows-x86_64/PharoVM-10.0.5-2757766f-Windows-x86_64-bin.zip)
set(VM_URL_HASH SHA256=e7430f753ae51fbec8b6a6105f9721cd503d13d0e4ad8069f74da0f6a32c8055)
set(VM_URL_HASH SHA256=917dbbef15b870ecf5ecf449bd6be39437985c6e3f056620e9acda60ea58e09e)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64"))
message("Defining Linux AARCH64 VM to download for code generation")
set(VMMAKER_VM ${VMMAKER_DIR}/vm/pharo)
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ AbstractComposedImageAccess >> createImageDirectory: imageFileName [
self
cppIf: ((self defined: #_WIN32) or: [(self defined: #_WIN64)])
ifTrue: [ self mkdir: imageFileName ]
ifFalse: [ self mkdir: imageFileName _: 0777 ] ]
ifFalse: [ self mkdir: imageFileName _: 8r777 ] ]
inSmalltalk: [
imageFileName asFileReference ensureDeleteAll.
imageFileName asFileReference ensureCreateDirectory ]
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/CoInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,7 @@ CoInterpreter >> assertValidStackedInstructionPointersIn: aStackPage line: ln [
theIP = cogit ceReturnToInterpreterPC ifTrue:
[theIP := self iframeSavedIP: theFP].
self assert: (theIP >= (methodObj + (objectMemory lastPointerOf: methodObj))
and: [theIP < (methodObj + (objectMemory numBytesOfBytes: methodObj) + objectMemory baseHeaderSize - 1)])
and: [theIP <= (methodObj + (objectMemory numBytesOfBytes: methodObj) + objectMemory baseHeaderSize - 1)])
l: ln.
prevFrameWasCogged := false].
theIP := (stackPages unsignedLongAt: theFP + FoxCallerSavedIP) asUnsignedInteger.
Expand Down
3 changes: 1 addition & 2 deletions smalltalksrc/VMMaker/Spur32BitMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -842,7 +842,6 @@ Spur32BitMemoryManager >> setIsImmutableOf: objOop to: aBoolean [
{ #category : #'header access' }
Spur32BitMemoryManager >> setIsMarkedOf: objOop to: aBoolean [
self assert: (self isFreeObject: objOop) not.
self assert: (memoryMap isPermanentObject: objOop) not.

self flag: #endianness.
self unsignedLongAt: objOop + 4
Expand Down Expand Up @@ -905,7 +904,7 @@ Spur32BitMemoryManager >> shorten: objOop toIndexableSize: indexableSize [
ofObject: copy
withValue: (self fetchPointer: i ofObject: objOop)].
(self isRemembered: objOop) ifTrue:
[fromOldSpaceRememberedSet doRemember: copy].
[fromOldSpaceRememberedSet remember: copy].
self forward: objOop to: copy.
^0].

Expand Down
3 changes: 1 addition & 2 deletions smalltalksrc/VMMaker/Spur64BitMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -973,7 +973,6 @@ Spur64BitMemoryManager >> setIsImmutableOf: objOop to: aBoolean [
{ #category : #'header access' }
Spur64BitMemoryManager >> setIsMarkedOf: objOop to: aBoolean [
self assert: (self isFreeObject: objOop) not.
self assert: (memoryMap isPermanentObject: objOop) not.

self unsignedLongAt: objOop
put: (aBoolean
Expand Down Expand Up @@ -1036,7 +1035,7 @@ Spur64BitMemoryManager >> shorten: objOop toIndexableSize: indexableSize [
ofObject: copy
withValue: (self fetchPointer: i ofObject: objOop)].
(self isRemembered: objOop) ifTrue:
[fromOldSpaceRememberedSet doRemember: copy].
[fromOldSpaceRememberedSet remember: copy].
self forward: objOop to: copy.
^0].

Expand Down
70 changes: 48 additions & 22 deletions smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ SpurGenerationScavenger >> copyToOldSpace: survivor bytes: bytesInObject format:
[:p| | field |
field := manager longAt: survivor + p.
(manager isReallyYoung: field) ifTrue:
[manager getFromOldSpaceRememberedSet doRemember: newOop.
[manager getFromOldSpaceRememberedSet remember: newOop.
^newOop]]].
^newOop
]
Expand Down Expand Up @@ -727,7 +727,7 @@ SpurGenerationScavenger >> logTenuringPolicy [
{ #category : #scavenger }
SpurGenerationScavenger >> mapOopsFromPermSpace [

| destIndex sourceIndex referrer |
| destIndex sourceIndex referrer result |

<inline: #never>

Expand All @@ -738,21 +738,31 @@ SpurGenerationScavenger >> mapOopsFromPermSpace [
It has to be in the remembered set if there are references to non permanent objects.
I will be compacting the rememberedSet while iterating it"

[sourceIndex < manager getFromPermSpaceRememberedSet rememberedSetSize] whileTrue:
[ referrer := manager getFromPermSpaceRememberedSet objectAt: sourceIndex.
[sourceIndex < manager getFromPermToNewSpaceRememberedSet rememberedSetSize] whileTrue:
[ referrer := manager getFromPermToNewSpaceRememberedSet objectAt: sourceIndex.

self deny: (manager isEphemeron: referrer).
self deny: (manager isWeakNonImm: referrer).

(self scavengeReferentsOfFromPermSpace: referrer)
result := self scavengeReferentsOfFromPermSpace: referrer.

result = 1
ifTrue:
[manager getFromPermSpaceRememberedSet save: referrer at: destIndex.
[
"Refers new space, we keep it"
manager getFromPermToNewSpaceRememberedSet save: referrer at: destIndex.
destIndex := destIndex + 1]
ifFalse:
[ manager setIsRememberedOf: referrer to: false].
[
"We clean the remembered set flag, it is only marking if it is maybe pointing to new objects"
manager setIsRememberedOf: referrer to: false.
"Refers to Old Space, if refers to perm space only, I do nothing. I remove it from the remembered set fromPermSpaceToNewSpace"
result = 2 ifTrue: [
manager getFromPermToOldSpaceRememberedSet rememberWithoutMarkingAsRemembered: referrer]
].
sourceIndex := sourceIndex + 1].

manager getFromPermSpaceRememberedSet setRememberedSetSize: destIndex.
manager getFromPermToNewSpaceRememberedSet setRememberedSetSize: destIndex.

"self assert: (manager isPermSpaceRememberedSetSane)."
]
Expand All @@ -779,7 +789,8 @@ SpurGenerationScavenger >> newSpaceStart: startAddress newSpaceBytes: totalBytes
eden start: futureSpace limit; limit: startAddress + totalBytes.

manager getFromOldSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermToOldSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermToNewSpaceRememberedSet fudge: self rememberedSetFudge.

self assert: self futureSpace limit <= (startAddress + totalBytes).
self assert: self eden start \\ manager allocationUnit
Expand Down Expand Up @@ -865,13 +876,21 @@ SpurGenerationScavenger >> printRememberedSet [
space;
shortPrintOop: oop ].

coInterpreter print: 'From Permpace:'; cr.
coInterpreter print: 'From Permpace to OldSpace:'; cr.

manager getFromPermSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
manager getFromPermToOldSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
coInterpreter
printNum: i;
space;
shortPrintOop: oop ]
shortPrintOop: oop ].

coInterpreter print: 'From Permpace to NewSpace:'; cr.

manager getFromPermToNewSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
coInterpreter
printNum: i;
space;
shortPrintOop: oop ]
]

{ #category : #'debug support' }
Expand Down Expand Up @@ -985,7 +1004,7 @@ SpurGenerationScavenger >> processWeaklings [
((self processWeakSurvivor: weakObj) and: [
(manager getMemoryMap isOldObject: weakObj) and: [
(manager isRemembered: weakObj) not ] ]) ifTrue: [
manager getFromOldSpaceRememberedSet doRemember: weakObj ].
manager getFromOldSpaceRememberedSet remember: weakObj ].
weakCorpse := self nextCorpseOrNil: weakCorpse ].
weakList := nil ]
]
Expand Down Expand Up @@ -1114,7 +1133,7 @@ SpurGenerationScavenger >> scavengeLoop [
]

{ #category : #scavenger }
SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: shouldKeepReferrerTestingBlock [
SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalTestingBlock: additionalTestingBlock [
"scavengeReferentsOf: referrer inspects all the pointers in referrer. If
any are new objects, it has them moved to FutureSurvivorSpace, and
answers truth. If there are no new referents, it answers falsity. To handle
Expand Down Expand Up @@ -1156,12 +1175,12 @@ SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalShouldKeepRef
[newLocation := self copyAndForward: referent.
(manager isYoung: newLocation)
ifTrue: [foundNewReferentOrIsWeakling := true]
ifFalse: [(shouldKeepReferrerTestingBlock value: referrer value: newLocation) ifTrue: [ foundNewReferentOrIsWeakling := true ]]].
ifFalse: [additionalTestingBlock value: referrer value: newLocation]].
manager storePointerUnchecked: i ofMaybeForwardedObject: referrer withValue: newLocation]
ifFalse:
[
manager storePointerUnchecked: i ofMaybeForwardedObject: referrer withValue: referent.
(shouldKeepReferrerTestingBlock value: referrer value: referent) ifTrue: [ foundNewReferentOrIsWeakling := true ]]]].
additionalTestingBlock value: referrer value: referent]]].
^foundNewReferentOrIsWeakling
]

Expand All @@ -1170,23 +1189,30 @@ SpurGenerationScavenger >> scavengeReferentsOfFromOldSpace: referrer [

<inline: #never>

^ self scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: [ :aReferrer :aReferent | false ].
^ self
scavengeReferentsOf: referrer
additionalTestingBlock: [ :aReferrer :aReferent | "Do nothing" ].
]

{ #category : #scavenger }
SpurGenerationScavenger >> scavengeReferentsOfFromPermSpace: referrer [

<inline: #never>

| returnValue |
| returnValue refersOldSpace |

refersOldSpace := false.

returnValue := self
scavengeReferentsOf: referrer
additionalShouldKeepReferrerTestingBlock: [ :aReferrer :referent |
(manager isPermanent: referent) not
and: [ (manager isFixedKnownObject: referent) not ] ].
additionalTestingBlock: [ :aReferrer :referent |
(refersOldSpace not and: [ (manager isFixedKnownObject: referent) not and: [ (manager isPermanent: referent) not ]])
ifTrue: [ refersOldSpace := true ]
].

^ returnValue.
returnValue ifTrue: [ ^ 1 "Refers NewSpace" ].
refersOldSpace ifTrue: [ ^ 2 "Refers OldSpace only" ].
^ 3 "Refers PermSpace only"
]

{ #category : #scavenger }
Expand Down
Loading

0 comments on commit cefbe12

Please sign in to comment.