@@ -60,7 +60,8 @@ Class {
6060 ' mobileStart' ,
6161 ' objectAfterLastMobileObject' ,
6262 ' savedFirstFieldsSpace' ,
63- ' savedFirstFieldsSpaceNotInOldSpace'
63+ ' savedFirstFieldsSpaceNotInOldSpace' ,
64+ ' savedFirstFieldSpaceMaxSlots'
6465 ],
6566 #pools : [
6667 ' VMBytecodeConstants'
@@ -162,6 +163,23 @@ SpurPlanningCompactor >> compact [
162163 self endCompaction
163164]
164165
166+ { #category : #' space management' }
167+ SpurPlanningCompactor >> configureSavedFirstFieldsSpaceStart: theStart limit: theLimit isOldSpace: isOldSpace [
168+ " Use teden to hold the savedFirstFieldsSpace."
169+
170+ < inline: true >
171+ | limit |
172+ limit := theLimit.
173+ savedFirstFieldSpaceMaxSlots ifNotNil: [
174+ limit := limit min:
175+ (theStart + (savedFirstFieldSpaceMaxSlots * manager bytesPerOop)) ].
176+
177+ savedFirstFieldsSpace
178+ start: theStart;
179+ limit: limit.
180+ savedFirstFieldsSpaceNotInOldSpace := isOldSpace not
181+ ]
182+
165183{ #category : #compaction }
166184SpurPlanningCompactor >> copyAndUnmark: firstPass [
167185 " Sweep the heap, unmarking all objects and moving mobile objects to their correct positions,
@@ -351,11 +369,12 @@ SpurPlanningCompactor >> freeFrom: initialToFinger upTo: limit nextObject: nextO
351369 [manager addFreeChunkWithBytes: limit - toFinger at: toFinger]
352370]
353371
354- { #category : #' instance initialization' }
372+ { #category : #initialization }
355373SpurPlanningCompactor >> initialize [
356374 biasForGC := true .
357375 savedFirstFieldsSpace := SpurContiguousObjStack new .
358- savedFirstFieldsSpaceNotInOldSpace := true
376+ savedFirstFieldsSpaceNotInOldSpace := true .
377+ savedFirstFieldSpaceMaxSlots := nil .
359378]
360379
361380{ #category : #compaction }
@@ -463,6 +482,7 @@ SpurPlanningCompactor >> planCompactSavingForwarders [
463482 toFinger := manager startOfObject: firstFreeObject.
464483 top := savedFirstFieldsSpace start.
465484 startOfPreviousPin := 0 .
485+ lastMobileObject := nil .
466486 manager allOldSpaceEntitiesFrom: firstFreeObject do:
467487 [:o |
468488 self check: o.
@@ -508,6 +528,7 @@ SpurPlanningCompactor >> planCompactSavingForwarders [
508528 [savedFirstFieldsSpace top: top - manager bytesPerOop.
509529 objectAfterLastMobileObject := manager oldSpaceObjectAfter: lastMobileObject.
510530 ^ false ]]]].
531+
511532 " If the heap is already fully compacted there will be no lastMobileObject..."
512533 lastMobileObject ifNotNil:
513534 [savedFirstFieldsSpace top: top - manager bytesPerOop.
@@ -595,6 +616,12 @@ SpurPlanningCompactor >> repinRememberedSet [
595616 scavenger relocateRememberedSet
596617]
597618
619+ { #category : #' space management' }
620+ SpurPlanningCompactor >> savedFirstFieldSpaceMaxSlots: aNumber [
621+
622+ savedFirstFieldSpaceMaxSlots := aNumber
623+ ]
624+
598625{ #category : #' space management' }
599626SpurPlanningCompactor >> savedFirstFieldsSpaceInFreeChunk [
600627 < inline: true >
@@ -947,11 +974,12 @@ SpurPlanningCompactor >> updateSavedFirstFieldsSpaceIfNecessary [
947974{ #category : #' space management' }
948975SpurPlanningCompactor >> useEdenForSavedFirstFieldsSpace [
949976 " Use teden to hold the savedFirstFieldsSpace."
977+
950978 < inline: true >
951- savedFirstFieldsSpace
952- start : scavenger eden start;
953- limit: scavenger eden limit.
954- savedFirstFieldsSpaceNotInOldSpace := true .
979+ self
980+ configureSavedFirstFieldsSpaceStart : scavenger eden start
981+ limit: scavenger eden limit
982+ isOldSpace: false .
955983 self deny: self savedFirstFieldsSpaceWasAllocated
956984]
957985
@@ -960,35 +988,39 @@ SpurPlanningCompactor >> useFreeChunkForSavedFirstFieldsSpace: highestSuitableFr
960988 " Use the supplied free chunk to hold the savedFirstFieldsSpace. Invoked when
961989 eden is found not to be big enough for the job. Avoid the first few fields so as
962990 not to destroy the free chunk and there by confuse object enumeration."
991+
963992 < inline: true >
964993 self assert: (manager validFreeTreeChunk: highestSuitableFreeBlock).
965- savedFirstFieldsSpace
966- start: highestSuitableFreeBlock + (manager freeChunkLargerIndex * manager bytesPerOop);
967- limit: (manager addressAfter: highestSuitableFreeBlock).
968- savedFirstFieldsSpaceNotInOldSpace := false .
994+ self
995+ configureSavedFirstFieldsSpaceStart: highestSuitableFreeBlock
996+ + (manager freeChunkLargerIndex * manager bytesPerOop)
997+ limit: (manager addressAfter: highestSuitableFreeBlock)
998+ isOldSpace: false .
969999 self deny: self savedFirstFieldsSpaceWasAllocated
9701000]
9711001
9721002{ #category : #' space management' }
9731003SpurPlanningCompactor >> useSegmentForSavedFirstFieldsSpace: spaceEstimate [
9741004 " Attempt to allocate a memory segment large enough to hold the savedFirstFieldsSpace.
9751005 Invoked when neither eden nor a large free chunk are found to be big enough for the job."
976- | roundedSize allocatedSize |
1006+
9771007 < var: #segAddress type: #' void *' >
1008+ | roundedSize allocatedSize |
9781009 roundedSize := spaceEstimate + 1023 // 1024 * 1024 .
979- (manager " sent to the manager so that the simulator can increase memory to simulate a new segment"
980- sqAllocateMemorySegmentOfSize: roundedSize
981- Above: (manager segmentManager firstGapOfSizeAtLeast: roundedSize)
982- AllocatedSizeInto: (self cCode: [self addressOf: allocatedSize]
983- inSmalltalk: [[:sz | allocatedSize := sz]])) ifNotNil:
984- [:segAddress |
985- savedFirstFieldsSpace
986- start: segAddress asUnsignedIntegerPtr;
987- limit: segAddress asUnsignedIntegerPtr + allocatedSize.
988- savedFirstFieldsSpaceNotInOldSpace := true .
989- self assert: self savedFirstFieldsSpaceWasAllocated.
990- ^ true ].
991- ^ false
1010+ (manager
1011+ sqAllocateMemorySegmentOfSize: roundedSize
1012+ Above: (manager segmentManager firstGapOfSizeAtLeast: roundedSize)
1013+ AllocatedSizeInto: (self
1014+ cCode: [ self addressOf: allocatedSize ]
1015+ inSmalltalk: [ [ :sz | allocatedSize := sz ] ])) ifNotNil: [ :segAddress |
1016+ self
1017+ configureSavedFirstFieldsSpaceStart:
1018+ segAddress asUnsignedIntegerPtr
1019+ limit: segAddress asUnsignedIntegerPtr + allocatedSize
1020+ isOldSpace: true .
1021+ self assert: self savedFirstFieldsSpaceWasAllocated.
1022+ ^ true ]. " sent to the manager so that the simulator can increase memory to simulate a new segment"
1023+ ^ false
9921024]
9931025
9941026{ #category : #private }
0 commit comments