[Vm-dev] VM Maker: VMMaker.oscog.seperateMarking-WoC.3252.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Aug 10 10:58:27 UTC 2022
Tom Braun uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog.seperateMarking-WoC.3252.mcz
==================== Summary ====================
Name: VMMaker.oscog.seperateMarking-WoC.3252
Author: WoC
Time: 10 August 2022, 12:57:43.436127 pm
UUID: a36ddae8-e692-4d21-9c93-353093cdbc64
Ancestors: VMMaker.oscog.seperateMarking-WoC.3251
fixed off by one error in incremental marking
=============== Diff against VMMaker.oscog.seperateMarking-WoC.3251 ===============
Item was changed:
----- Method: SpurIncrementalMarker>>incrementalMark (in category 'marking - incremental') -----
incrementalMark
"does one marking cycle. Breaks after a certain amount of slots is marked and the last object, that amount is crossed in, is completely scanned"
| currentObj slotsLeft |
"manager objStack: manager markStack do: [:index :page | Transcript showln: (manager fetchPointer: index ofObject: page)].
manager sizeOfObjStack: manager markStack"
currentObj := manager popObjStack: manager markStack.
"skip young objects. They get already scanned as they are part of the roots"
[(currentObj notNil) and: [(manager isNonImmediate: currentObj) and: [manager isYoung: currentObj]]]
whileTrue: [currentObj := manager popObjStack: manager markStack.].
currentObj
ifNil: [^ true]. "there is nothing more on the stack and we are done"
slotsLeft := SlotLimitPerPass.
[
| slotNumber slotsToVisit startIndex |
"after passing the limit we push the current index on the stack. Is the currentObj only an index? "
(manager isImmediate: currentObj)
ifTrue: [startIndex := manager integerValueOf: currentObj.
currentObj := manager popObjStack: manager markStack.]
ifFalse: [startIndex := 0.
self markAndTraceClassOf: currentObj.
"eager color the object black. Either it will get scanned completely and the color is correct
or we have at least scanned some of the slots. In the second case the mutator could
modify one of the slots of the object that already were scanned and we would could lose
this object. Therefore color the object early to trigger the write barrier on writes. There will
be some overhead (trigger the barrier always although only the already scanned slots are
technically black) but it seems we need to do this for correctness"
self blackenObject: currentObj].
slotNumber := manager numStrongSlotsOfInephemeral: currentObj.
slotsToVisit := slotNumber - startIndex.
slotsLeft - slotsToVisit < 0
ifTrue: [
self
markFrom: startIndex
nSlots: slotsLeft
of: currentObj.
"If we need to abort earlier we push the index and the currently scanned object on the marking stack. Otherwise it is not possible
for immediates to be on the stack (they have no fields to be scanned) -> we can use the immediated to detect this pattern"
(manager topOfObjStack: manager markStack) ~= currentObj ifTrue:
[manager push: currentObj onObjStack: manager markStack].
+ manager push: (manager integerObjectOf: slotsLeft) onObjStack: manager markStack.
- manager push: (manager integerObjectOf: slotsLeft + 1) onObjStack: manager markStack.
"we need to abort early to not run into some extreme corner cases (giant objects) that would explode our mark time assumptions"
^ false]
ifFalse: ["we can mark all"
slotsLeft := slotsLeft - slotsToVisit.
self markFrom: startIndex nSlots: slotsToVisit of: currentObj].
currentObj := manager popObjStack: manager markStack.
[(currentObj notNil) and: [(manager isNonImmediate: currentObj) and: [manager isYoung: currentObj]]]
whileTrue: [currentObj := manager popObjStack: manager markStack.].
"repeat while there still are objects"
currentObj notNil] whileTrue.
^ true!
More information about the Vm-dev
mailing list