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

commits at source.squeak.org commits at source.squeak.org
Thu Sep 24 21:24:49 UTC 2020


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

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

Name: VMMaker.oscog-eem.2814
Author: eem
Time: 24 September 2020, 2:24:25.855864 pm
UUID: 53654b48-aee6-4a54-81cd-359178c61658
Ancestors: VMMaker.oscog-eem.2813

Use bridges to use a single loop for allObjectsDo: et al.  Install a bridge from freeStart (end of eden) to newSpaceStart and from pastSpaceStart (end of past space) to start of eden as required.
e.g. on MacOS X x86_64 saves 1.6% of the debug VM executable, 0.7% production.

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

Item was added:
+ ----- Method: SpurMemoryManager>>allEntitiesFrom:do: (in category 'object enumeration-private') -----
+ allEntitiesFrom: initialObject do: aBlock
+ 	<inline: true>
+ 	| prevObj prevPrevObj objOop |
+ 	prevPrevObj := prevObj := nil.
+ 	objOop := initialObject.
+ 	self enableObjectEnumerationFrom: initialObject.
+ 	[self assert: objOop \\ self allocationUnit = 0.
+ 	 self oop: objOop isLessThan: endOfMemory] whileTrue:
+ 		[self assert: (self long64At: objOop) ~= 0.
+ 		 aBlock value: objOop.
+ 		 prevPrevObj := prevObj.
+ 		 prevObj := objOop.
+ 		 objOop := self objectAfter: objOop limit: endOfMemory].
+ 	self touch: prevPrevObj.
+ 	self touch: prevObj!

Item was removed:
- ----- Method: SpurMemoryManager>>allExistingNewSpaceObjectsDo: (in category 'object enumeration') -----
- allExistingNewSpaceObjectsDo: aBlock
- 	<inline: true>
- 	| prevObj prevPrevObj objOop limit |
- 	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 eden and pastSpace."
- 	objOop := self objectStartingAt: scavenger eden start.
- 	limit := freeStart.
- 	[self oop: objOop isLessThan: limit] whileTrue:
- 		[self assert: (self isEnumerableObjectNoAssert: objOop).
- 		 aBlock value: objOop.
- 		 prevPrevObj := prevObj.
- 		 prevObj := objOop.
- 		 objOop := self objectAfter: objOop limit: freeStart].
- 	objOop := self objectStartingAt: scavenger pastSpace start.
- 	limit := pastSpaceStart.
- 	[self oop: objOop isLessThan: limit] whileTrue:
- 		[self assert: (self isEnumerableObjectNoAssert: objOop).
- 		 aBlock value: objOop.
- 		 prevPrevObj := prevObj.
- 		 prevObj := objOop.
- 		 objOop := self objectAfter: objOop limit: limit].
- 	self touch: prevPrevObj.
- 	self touch: prevObj!

Item was removed:
- ----- Method: SpurMemoryManager>>allExistingObjectsDo: (in category 'object enumeration') -----
- allExistingObjectsDo: aBlock
- 	"Enumerate all objects, excluding any objects created
- 	 during the execution of allExistingObjectsDo:."
- 	<inline: true>
- 	self allExistingNewSpaceObjectsDo: aBlock.
- 	self allExistingOldSpaceObjectsDo: aBlock!

Item was removed:
- ----- Method: SpurMemoryManager>>allExistingOldSpaceObjectsDo: (in category 'object enumeration') -----
- allExistingOldSpaceObjectsDo: aBlock
- 	"Enumerate all old space objects, excluding any objects created
- 	 during the execution of allExistingOldSpaceObjectsDo:."
- 	<inline: true>
- 	| oldSpaceLimit prevObj prevPrevObj objOop |
- 	prevPrevObj := prevObj := nil.
- 	objOop := self firstObject.
- 	oldSpaceLimit := endOfMemory.
- 	[self assert: objOop \\ self allocationUnit = 0.
- 	 self oop: objOop isLessThan: oldSpaceLimit] whileTrue:
- 		[(self isEnumerableObject: objOop) ifTrue:
- 			[aBlock value: objOop].
- 		 prevPrevObj := prevObj.
- 		 prevObj := objOop.
- 		 objOop := self objectAfter: objOop limit: oldSpaceLimit].
- 	self touch: prevPrevObj.
- 	self touch: prevObj!

Item was changed:
+ ----- Method: SpurMemoryManager>>allHeapEntitiesDo: (in category 'object enumeration-private') -----
- ----- Method: SpurMemoryManager>>allHeapEntitiesDo: (in category 'object enumeration') -----
  allHeapEntitiesDo: aBlock
  	"N.B. e.g. allObjects relies on the old/new order here."
  	<inline: true>
  	self allOldSpaceEntitiesDo: aBlock.
  	self allNewSpaceEntitiesDo: aBlock!

Item was changed:
+ ----- Method: SpurMemoryManager>>allNewSpaceEntitiesDo: (in category 'object enumeration-private') -----
- ----- Method: SpurMemoryManager>>allNewSpaceEntitiesDo: (in category 'object enumeration') -----
  allNewSpaceEntitiesDo: aBlock
  	"Enumerate all new space objects, including free objects."
  	<inline: true>
+ 	| prevObj prevPrevObj objOop |
- 	| prevObj prevPrevObj objOop limit |
  	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).
  	objOop := self objectStartingAt: scavenger pastSpace start.
+ 	self enableNewSpaceObjectEnumerationFrom: objOop.
- 	limit := pastSpaceStart.
- 	[self oop: objOop isLessThan: limit] whileTrue:
- 		[aBlock value: objOop.
- 		 prevPrevObj := prevObj.
- 		 prevObj := objOop.
- 		 objOop := self objectAfter: objOop limit: limit].
- 	objOop := self objectStartingAt: scavenger eden 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>>allNewSpaceObjectsDo: (in category 'object enumeration') -----
  allNewSpaceObjectsDo: aBlock
  	"Enumerate all new space objects, excluding free objects."
  	<inline: true>
  	self allNewSpaceEntitiesDo:
  		[:objOop|
+ 		 self assert: (self isBridgeOrEnumerableObjectNoAssert: objOop).
- 		 self assert: (self isEnumerableObjectNoAssert: objOop).
  		 aBlock value: objOop]!

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

Item was added:
+ ----- Method: SpurMemoryManager>>allObjectsFrom:do: (in category 'object enumeration') -----
+ allObjectsFrom: initialObject do: aBlock
+ 	"Enumerate all objects (i.e. exclude bridges, forwarders and free chunks)
+ 	 in oldSpace starting at initialObject."
+ 	<inline: true>
+ 	self allEntitiesFrom: initialObject
+ 		do: [:objOop|
+ 			 (self isEnumerableObject: objOop) ifTrue:
+ 				[aBlock value: objOop]]!

Item was changed:
+ ----- Method: SpurMemoryManager>>allOldSpaceEntitiesDo: (in category 'object enumeration-private') -----
- ----- Method: SpurMemoryManager>>allOldSpaceEntitiesDo: (in category 'object enumeration') -----
  allOldSpaceEntitiesDo: aBlock
  	<inline: true>
  	self allOldSpaceEntitiesFrom: self firstObject do: aBlock!

Item was changed:
+ ----- Method: SpurMemoryManager>>allOldSpaceEntitiesFrom:do: (in category 'object enumeration-private') -----
- ----- Method: SpurMemoryManager>>allOldSpaceEntitiesFrom:do: (in category 'object enumeration') -----
  allOldSpaceEntitiesFrom: initialObject do: aBlock
  	<inline: true>
  	| prevObj prevPrevObj objOop |
  	self assert: (self isOldObject: initialObject).
  	prevPrevObj := prevObj := nil.
  	objOop := initialObject.
  	[self assert: objOop \\ self allocationUnit = 0.
  	 self oop: objOop isLessThan: endOfMemory] whileTrue:
  		[self assert: (self long64At: objOop) ~= 0.
  		 aBlock value: objOop.
  		 prevPrevObj := prevObj.
  		 prevObj := objOop.
  		 objOop := self objectAfter: objOop limit: endOfMemory].
  	self touch: prevPrevObj.
  	self touch: prevObj!

Item was changed:
+ ----- Method: SpurMemoryManager>>allPastSpaceEntitiesDo: (in category 'object enumeration-private') -----
- ----- Method: SpurMemoryManager>>allPastSpaceEntitiesDo: (in category 'object enumeration') -----
  allPastSpaceEntitiesDo: aBlock
  	"Enumerate all past space objects, including free objects."
  	<inline: true>
  	| prevObj prevPrevObj objOop |
  	prevPrevObj := prevObj := nil.
  	objOop := self objectStartingAt: scavenger pastSpace start.
  	[self oop: objOop isLessThan: pastSpaceStart] whileTrue:
  		[aBlock value: objOop.
  		 prevPrevObj := prevObj.
  		 prevObj := objOop.
  		 objOop := self objectAfter: objOop limit: pastSpaceStart].
  	self touch: prevPrevObj.
  	self touch: prevObj!

Item was added:
+ ----- Method: SpurMemoryManager>>enableNewSpaceObjectEnumerationFrom: (in category 'object enumeration-private') -----
+ enableNewSpaceObjectEnumerationFrom: 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: #always>
+ 	((self oop: initialObject isLessThan: scavenger eden start)
+ 	 and: [scavenger eden start > pastSpaceStart]) ifTrue:
+ 		[self initSegmentBridgeWithBytes: scavenger eden start - pastSpaceStart at: pastSpaceStart]!

Item was added:
+ ----- 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: #always>
+ 	(self oop: initialObject isLessThan: oldSpaceStart) ifTrue:
+ 		[self initSegmentBridgeWithBytes: oldSpaceStart - freeStart at: freeStart.
+ 		 self enableNewSpaceObjectEnumerationFrom: initialObject]!

Item was added:
+ ----- Method: SpurMemoryManager>>isBridgeOrEnumerableObjectNoAssert: (in category 'object enumeration') -----
+ isBridgeOrEnumerableObjectNoAssert: objOop
+ 	"Answer if objOop should be included in an allObjects...Do: enumeration.
+ 	 This is for assert-checking only."
+ 	| classIndex |
+ 	classIndex := self classIndexOf: objOop.
+ 	^classIndex >= self isForwardedObjectClassIndexPun
+ 	  	ifTrue: [classIndex < (numClassTablePages * self classTablePageSize)]
+ 		ifFalse: [classIndex = self segmentBridgePun]!



More information about the Vm-dev mailing list