[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:

==================== 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') -----
  	"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.].
  		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: [
  					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