Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2791.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2791 Author: eem Time: 19 August 2020, 6:21:04.014485 pm UUID: 04cdce33-b4a9-4acb-982e-ed9393a1783b Ancestors: VMMaker.oscog-eem.2790 Looking at class indentityHash distributions in my current VMMaker image it is clear that setting the classTableIndex to point at the start of the last used page is not a good strategy, and leads to far too sparse a class table. So change the policy and set the classTableIndex to the first unused slot (unless bootstrapping). =============== Diff against VMMaker.oscog-eem.2790 =============== Item was changed: ----- Method: SpurMemoryManager>>setHiddenRootsObj: (in category 'class table') ----- setHiddenRootsObj: anOop hiddenRootsObj := anOop. self cCode: [self assert: self validClassTableRootPages] inSmalltalk: [numClassTablePages ifNotNil: [self assert: self validClassTableRootPages]]. classTableFirstPage := self fetchPointer: 0 ofObject: hiddenRootsObj. self assert: (self numSlotsOf: classTableFirstPage) - 1 = self classTableMinorIndexMask. "Hack fix. A bug in markAndTraceClassOf: caused the class of the first class table page to be changed from its pun. This can be restored manually, but we do it here too." self flag: 'remove at some stage'. (self classIndexOf: classTableFirstPage) ~= self arrayClassIndexPun ifTrue: [self setClassIndexOf: classTableFirstPage to: self arrayClassIndexPun]. - "Set classTableIndex to the start of the last used page (excepting first page). - Set numClassTablePages to the number of used pages." numClassTablePages := self classTableRootSlots. + self bootstrapping ifTrue: + ["Set classTableIndex to the start of the last used page (excepting first page). + Set numClassTablePages to the number of used pages." + 2 to: numClassTablePages - 1 do: + [:i| + (self fetchPointer: i ofObject: hiddenRootsObj) = nilObj ifTrue: + [numClassTablePages := i. + classTableIndex := (i - 1 max: 1) << self classTableMajorIndexShift. + ^self]]. + "no unused pages; set it to the start of the second page." + classTableIndex := 1 << self classTableMajorIndexShift. + ^self]. + "If loading an image, set the classTableIndex to the first unused slot in the class table after the first page. + Set numClassTablePages to the number of used pages. + Set classTableIndex to point at the first unused entry. First set it to the max as a sentinel." + classTableIndex := numClassTablePages << self classTableMajorIndexShift. + 1 to: numClassTablePages - 1 do: + [:i| | page j | + (page := self fetchPointer: i ofObject: hiddenRootsObj) = nilObj + ifFalse: + [classTableIndex >> self classTableMajorIndexShift > i ifTrue: + [j := 0. + [j < self classTablePageSize] whileTrue: + [(self fetchPointer: j ofObject: page) = nilObj ifTrue: + [classTableIndex := i << self classTableMajorIndexShift + j. + j := self classTablePageSize]. + j := j + 1]]] + ifTrue: + [classTableIndex >> self classTableMajorIndexShift > i ifTrue: + [classTableIndex := (i - 1 max: 1) << self classTableMajorIndexShift]. + numClassTablePages := i. + self assert: (self classOrNilAtIndex: classTableIndex) = nilObj. + ^self]]. + "no unused slots; set it to the start of the second page." + classTableIndex >> self classTableMajorIndexShift >= numClassTablePages ifTrue: + [classTableIndex := 1 << self classTableMajorIndexShift]. + self assert: (self classOrNilAtIndex: classTableIndex) = nilObj! - 2 to: numClassTablePages - 1 do: - [:i| - (self fetchPointer: i ofObject: hiddenRootsObj) = nilObj ifTrue: - [numClassTablePages := i. - classTableIndex := (numClassTablePages - 1 max: 1) << self classTableMajorIndexShift. - ^self]]. - "no unused pages; set it to the start of the second page." - classTableIndex := 1 << self classTableMajorIndexShift! |
Free forum by Nabble | Edit this page |