[Vm-dev] VM Maker: VMMaker.oscog-eem.2818.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Sep 25 00:52:02 UTC 2020


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2818.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.2818
Author: eem
Time: 24 September 2020, 5:51:45.703537 pm
UUID: d667e95f-18d0-4af4-b376-b09f97569a74
Ancestors: VMMaker.oscog-eem.2817

Spur: Bridging new and old space.

Deal with either or both of pastSpace and eden being empty.
startAddressForBridgedHeapEnumeration may answer nilObj, or the start of eden or the start of pastSpace, which ever is the lowest address that poijts to an object, not just the start of an empty space.

Deal with pastSpace being completely full (at least partially).
enableObjectEnumerationFrom: does not create a bridge between pastSpace and eden if pastSpace is entirely full.  But this will *break* if there is onle one 64-bit word free at the end of pastSpace.  This needs dealing with.

Simulator: same event fix needed in StackInterpreterSimulator.

=============== Diff against VMMaker.oscog-eem.2817 ===============

Item was changed:
  ----- Method: SpurMemoryManager>>allNewSpaceEntitiesDo: (in category 'object enumeration-private') -----
  allNewSpaceEntitiesDo: aBlock
  	"Enumerate all new space objects, including free objects."
  	<inline: true>
+ 	| start prevObj prevPrevObj objOop |
- 	| prevObj prevPrevObj objOop |
  	prevPrevObj := prevObj := nil.
  	"After a scavenge eden is empty, futureSpace is empty, and all newSpace objects are
  	  in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden."
  	self assert: (scavenger pastSpace start < scavenger eden start).
+ 	start := self startAddressForBridgedHeapEnumeration.
+ 	start > freeStart ifTrue: [^self].
  	self initSegmentBridgeWithBytes: scavenger eden start - pastSpaceStart at: pastSpaceStart.
+ 	objOop := self objectStartingAt: start.
- 	objOop := self objectStartingAt: scavenger pastSpace start.
  	[self oop: objOop isLessThan: freeStart] whileTrue:
  		[aBlock value: objOop.
  		 prevPrevObj := prevObj.
  		 prevObj := objOop.
  		 objOop := self objectAfter: objOop limit: freeStart].
  	self touch: prevPrevObj.
  	self touch: prevObj!

Item was changed:
  ----- Method: SpurMemoryManager>>allObjectsDo: (in category 'object enumeration') -----
  allObjectsDo: aBlock
  	<inline: true>
+ 	| startObject |
+ 	startObject := self objectStartingAt: self startAddressForBridgedHeapEnumeration.
+ 	self enableObjectEnumerationFrom: startObject.
+ 	self allEntitiesFrom: startObject
- 	| firstObject |
- 	firstObject := self objectStartingAt: scavenger pastSpace start.
- 	self enableObjectEnumerationFrom: firstObject.
- 	self allEntitiesFrom: firstObject
  		do: [:objOop|
  			 (self isEnumerableObject: objOop) ifTrue:
  				[aBlock value: objOop]]!

Item was changed:
  ----- Method: SpurMemoryManager>>enableObjectEnumerationFrom: (in category 'object enumeration-private') -----
  enableObjectEnumerationFrom: initialObject
  	"We use bridges to stitch segments together to make it appear that the heap is one contiguous space.
  	 Bridges at the end of oldSpace segments are maintained.  Bridges at the end of pastSpace and eden
  	 are temporary, and are established here, depending on the current sizes of pastSpace end eden."
  	<inline: false>
  	(self oop: initialObject isLessThan: oldSpaceStart) ifTrue:
  		[freeStart > scavenger eden start
  			ifTrue:
  				[self initSegmentBridgeWithBytes: oldSpaceStart - freeStart at: freeStart.
+ 				 pastSpaceStart < scavenger eden start ifTrue: "past space can be entirely full (!!!!)"
+ 					[self initSegmentBridgeWithBytes: scavenger eden start - pastSpaceStart at: pastSpaceStart]]
- 				 self initSegmentBridgeWithBytes: scavenger eden start - pastSpaceStart at: pastSpaceStart]
  			ifFalse:"If eden is empty (e.g. at snapshot time), skip it entirely"
  				[self initSegmentBridgeWithBytes: oldSpaceStart - pastSpaceStart at: pastSpaceStart]]!

Item was added:
+ ----- Method: SpurMemoryManager>>startAddressForBridgedHeapEnumeration (in category 'object enumeration-private') -----
+ startAddressForBridgedHeapEnumeration
+ 	"Answer the address to start enumeration at if using the bridged enumerator.
+ 	 This is not suitable for the enumerators which enumerate old space before new space.
+ 	 The complication here is that either or both of pastSpace and eden may be empty."
+ 	<inline: #always>
+ 	^pastSpaceStart > scavenger pastSpace start
+ 		ifTrue: [scavenger pastSpace start]
+ 		ifFalse:
+ 			[freeStart > scavenger eden start
+ 				ifTrue: [scavenger eden start]
+ 				ifFalse: [oldSpaceStart]]!

Item was changed:
  ----- Method: StackInterpreterSimulator>>ioGetNextEvent: (in category 'I/O primitives') -----
  ioGetNextEvent: evtBuf
  	| evt |
  	"SimulatorMorphicModel browse"
  	eventQueue ifNil:
  		[^self primitiveFail].
  	eventQueue isEmpty ifFalse:
  		[evt :=  eventQueue next.
+ 		 1 to: evt size do:
+ 			[:i|
+ 			(evt at: i) ifNotNil:
+ 				[:val|
+ 				evtBuf
+ 					at: i - 1
+ 					put: (i = 2 ifTrue: [val bitAnd: MillisecondClockMask] ifFalse: [val])]]]!
- 		 1 to: evtBuf size do:
- 			[:i| (evt at: i) ifNotNil: [:val| evtBuf at: (i - 1) put: val asInteger]]]!



More information about the Vm-dev mailing list