[Vm-dev] VM Maker: VMMaker.oscog-cb.2375.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Apr 26 11:30:57 UTC 2018
ClementBera uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.2375.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.2375
Author: cb
Time: 26 April 2018, 1:30:32.640264 pm
UUID: 41eb0797-6cdb-4654-aa71-263c8dd85f53
Ancestors: VMMaker.oscog-cb.2374
Made C compiler happy (addressOf:, macro & shadowing non-sense)..
=============== Diff against VMMaker.oscog-cb.2374 ===============
Item was changed:
----- Method: SpurSegmentManager>>segments (in category 'accessing') -----
segments
+ <cmacro: '() GIV(segments)'>
^segments!
Item was changed:
----- Method: SpurSelectiveCompactor>>compactSegment:freeStart: (in category 'compaction') -----
compactSegment: segInfo freeStart: initialFreeStart
<var: 'segInfo' type: #'SpurSegmentInfo *'>
+ | currentEntity fillStart bytesToCopy numSlots bridge |
- | currentEntity fillStart bytesInObject numSlots bridge |
fillStart := initialFreeStart.
bridge := manager segmentManager bridgeFor: segInfo.
currentEntity := manager objectStartingAt: segInfo segStart.
[self oop: currentEntity isLessThan: bridge] whileTrue:
[(manager isFreeObject: currentEntity)
ifTrue:
["To avoid confusing too much Spur (especially the leak/free checks), we mark the free chunk as a word object."
manager detachFreeObject: currentEntity.
manager set: currentEntity classIndexTo: manager wordSizeClassIndexPun formatTo: manager wordIndexableFormat]
ifFalse:
["Copy the object in segmentToFill and replace it by a forwarder."
self assert: (manager isPinned: currentEntity) not.
numSlots := manager numSlotsOfAny: currentEntity.
+ bytesToCopy := manager bytesInObject: currentEntity.
- bytesInObject := manager bytesInObject: currentEntity.
self assert: (manager objectBytesForSlots: numSlots) = (manager bytesInObject: currentEntity).
+ manager mem: fillStart asVoidPointer cp: (manager startOfObject: currentEntity) asVoidPointer y: bytesToCopy.
- manager mem: fillStart asVoidPointer cp: (manager startOfObject: currentEntity) asVoidPointer y: bytesInObject.
self assert: (manager baseHeader: (manager objectStartingAt: fillStart)) = (manager baseHeader: currentEntity).
self assert: (manager fetchPointer: numSlots - 1 ofObject: (manager objectStartingAt: fillStart)) = (manager fetchPointer: numSlots - 1 ofObject: currentEntity).
manager forward: currentEntity to: (manager objectStartingAt: fillStart).
fillStart := fillStart + (manager objectBytesForSlots: numSlots).
self assert: (manager isForwarded: currentEntity).
self assert: fillStart < (segmentToFill segLimit - manager bridgeSize)].
currentEntity := manager objectAfter: currentEntity limit: manager endOfMemory].
self assert: currentEntity = bridge.
^ fillStart!
Item was changed:
----- Method: SpurSelectiveCompactor>>internalGlobalSweepAndSegmentOccupationAnalysis (in category 'sweep phase') -----
internalGlobalSweepAndSegmentOccupationAnalysis
"Iterate over old space, free unmarked objects, annotate each segment with each occupation"
| currentEntity nextBridge start segmentIndex currentUsed currentUnused |
currentEntity := manager firstObject.
nextBridge := manager segmentManager bridgeAt: 0.
segmentIndex := currentUnused := currentUsed := 0.
[self oop: currentEntity isLessThan: manager endOfMemory] whileTrue:
[currentEntity = nextBridge
ifTrue:
["End of segment, set occupation"
self
+ setOccupationAtIndex: segmentIndex
- setOccupation: (manager segmentManager segments at: segmentIndex)
used: currentUsed
unused: currentUnused.
currentUnused := currentUsed := 0.
segmentIndex := segmentIndex + 1.
self unmark: currentEntity.
nextBridge := manager segmentManager bridgeAt: segmentIndex]
ifFalse:
["In-segment, sweep and compute occupation"
(self canUseAsFreeSpace: currentEntity)
ifTrue:
["bulkFreeChunkFrom: may change a 1 word header
object to a double word header object"
start := manager startOfObject: currentEntity.
self bulkFreeChunkFrom: currentEntity.
currentEntity := manager objectStartingAt: start.
currentUnused := currentUnused + (manager numSlotsOfAny: currentEntity)]
ifFalse:
[self unmark: currentEntity.
currentUsed := currentUsed + (manager numSlotsOfAny: currentEntity)]].
currentEntity := manager objectAfter: currentEntity limit: manager endOfMemory].
"set last segment (last bridge = endOfMemory)"
self
+ setOccupationAtIndex: segmentIndex
- setOccupation: (manager segmentManager segments at: segmentIndex)
used: currentUsed
unused: currentUnused.!
Item was added:
+ ----- Method: SpurSelectiveCompactor>>setOccupationAtIndex:used:unused: (in category 'segment access') -----
+ setOccupationAtIndex: segmentIndex used: used unused: unused
+ "Swizzle is abused bit 8 isClaimed bits 0-7 occupation
+ Setting occupation resets the claim bit"
+ | occupation segInfo |
+ segInfo := self addressOf: (manager segmentManager segments at: segmentIndex).
+ occupation := used * 255 // (used + unused).
+ segInfo swizzle: occupation!
More information about the Vm-dev
mailing list