[Vm-dev] VM Maker: VMMaker.oscog-eem.728.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed May 21 18:04:21 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.728.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.728
Author: eem
Time: 21 May 2014, 11:01:45.177 am
UUID: 706ecf52-7165-4829-bfb3-8a9ac4f29216
Ancestors: VMMaker.oscog-eem.727
Spur:
Implement memory shrinkage.
Check free space around SpurSegmentManager
prepareForSnapshot & postSnapshot.
=============== Diff against VMMaker.oscog-eem.727 ===============
Item was changed:
----- Method: SpurMemoryManager>>garbageCollectForSnapshot (in category 'snapshot') -----
garbageCollectForSnapshot
self flushNewSpace. "There is no place to put newSpace in the snapshot file."
self fullGC.
+ segmentManager prepareForSnapshot.
+ self checkFreeSpace!
- segmentManager prepareForSnapshot!
Item was added:
+ ----- Method: SpurMemoryManager>>setLastSegment: (in category 'growing/shrinking memory') -----
+ setLastSegment: segInfo
+ "Update after removing a segment.
+ Here we cut back endOfMemory if required."
+ <var: #segInfo type: #'SpurSegmentInfo *'>
+ | currentEnd |
+ <var: #currentEnd type: #usqInt>
+ currentEnd := segInfo segLimit - self bridgeSize.
+ currentEnd <= endOfMemory ifTrue:
+ [endOfMemory := currentEnd.
+ freeOldSpaceStart > currentEnd ifTrue:
+ [freeOldSpaceStart :=currentEnd]]!
Item was changed:
----- Method: SpurMemoryManager>>shrinkObjectMemory: (in category 'growing/shrinking memory') -----
+ shrinkObjectMemory: delta
- shrinkObjectMemory: delta
"Attempt to shrink the object memory by the given delta amount."
+ <doNotGenerate>
+ segmentManager shrinkObjectMemory: delta!
- self cCode: [self print: 'shrinkObjectMemory: shouldBeImplemented'; cr]
- inSmalltalk: [self shouldBeImplemented]!
Item was changed:
----- Method: SpurMemoryManager>>sqAllocateMemorySegmentOfSize:Above:AllocatedSizeInto: (in category 'simulation only') -----
sqAllocateMemorySegmentOfSize: segmentSize Above: minAddress AllocatedSizeInto: allocSizePtrOrBlock
<doNotGenerate>
"Simulate heap growth by growing memory by segmentSize + a delta.
To test bridges alternate the delta between 0 bytes and 1M bytes
depending on the number of segments.
The delta will be the distance between segments to be bridged."
| delta newMemory start |
delta := segmentManager numSegments odd ifTrue: [1024 * 1024] ifFalse: [0].
+ "A previous shrink may have freed up memory. Don't bother to grow if there's already room."
+ segmentManager lastSegment segLimit + segmentSize + delta <= (memory size * 4) ifTrue:
+ [allocSizePtrOrBlock value: segmentSize.
+ ^minAddress + delta].
start := memory size * 4 + delta.
newMemory := memory class new: memory size + (segmentSize + delta / 4).
newMemory replaceFrom: 1 to: memory size with: memory startingAt: 1.
memory := newMemory.
allocSizePtrOrBlock value: segmentSize.
^start!
Item was added:
+ ----- Method: SpurMemoryManager>>sqDeallocateMemorySegmentAt:ofSize: (in category 'simulation only') -----
+ sqDeallocateMemorySegmentAt: startAddress ofSize: ammount
+ "This is a nop in the simulator."
+ <doNotGenerate>!
Item was added:
+ ----- Method: SpurSegmentManager>>findEmptySegNearestInSizeTo: (in category 'growing/shrinking memory') -----
+ findEmptySegNearestInSizeTo: size
+ | seg best delta |
+ <var: #seg type: #'SegmentInfo *'>
+ best := nil.
+ delta := size.
+ 0 to: numSegments - 1 do:
+ [:i|
+ seg := self addressOf: (segments at: i).
+ (self isEmptySegment: seg) ifTrue:
+ [best
+ ifNil: [best := seg]
+ ifNotNil:
+ [(size >= (seg segSize * 0.75)
+ and: [(seg segSize - size) abs < delta]) ifTrue:
+ [best := seg. delta := (seg segSize - size) abs]]]].
+ ^best!
Item was added:
+ ----- Method: SpurSegmentManager>>indexOfSegment: (in category 'growing/shrinking memory') -----
+ indexOfSegment: seg
+ <var: #seg type: #'SegmentInfo *'>
+ 0 to: numSegments - 1 do:
+ [:i|
+ seg segStart = (segments at: i) segStart ifTrue:
+ [^i]].
+ self error: 'segment not found'!
Item was added:
+ ----- Method: SpurSegmentManager>>isEmptySegment: (in category 'growing/shrinking memory') -----
+ isEmptySegment: seg
+ <var: #seg type: #'SegmentInfo *'>
+ | firstObj |
+ firstObj := manager objectStartingAt: seg segStart.
+ ^(manager isFreeObject: firstObj)
+ and: [(manager addressAfter: firstObj) = (seg segLimit - manager bridgeSize)]!
Item was added:
+ ----- Method: SpurSegmentManager>>lastSegment (in category 'accessing') -----
+ lastSegment
+ ^segments at: numSegments - 1!
Item was changed:
----- Method: SpurSegmentManager>>postSnapshot (in category 'snapshot') -----
postSnapshot
"Restore all shortened segments to their proper size, re-freeing the trailing space."
<inline: false>
| seg |
<var: #seg type: #'SpurSegmentInfo *'>
"Set endOfMemory first, to avoid assert fails in freeChunkWithBytes:at:."
seg := self addressOf: (segments at: numSegments - 1).
seg lastFreeObject
ifNil: [self assert: manager endOfMemory = (seg segLimit - manager bridgeSize)]
ifNotNil: [manager setEndOfMemory: seg savedSegSize + seg segStart - manager bridgeSize].
numSegments - 1 to: 0 by: -1 do:
[:i|
seg := self addressOf: (segments at: i).
seg lastFreeObject ifNotNil:
[:freeChunk| | address |
address := seg segLimit - manager bridgeSize.
seg segSize: seg savedSegSize.
self bridgeFrom: seg
to: (i < (numSegments - 1) ifTrue: [self addressOf: (segments at: i + 1)]).
manager
addFreeChunkWithBytes: seg segLimit - address - manager bridgeSize
+ at: address]]..
+ manager checkFreeSpace!
- at: address]]!
Item was added:
+ ----- Method: SpurSegmentManager>>removeSegment: (in category 'growing/shrinking memory') -----
+ removeSegment: emptySeg
+ <var: #emptySeg type: #'SpurSegmentInfo *'>
+ | i |
+ i := self indexOfSegment: emptySeg.
+ self assert: i > 0.
+
+ manager sqDeallocateMemorySegmentAt: emptySeg segStart ofSize: emptySeg segSize.
+
+ i to: numSegments - 1 do:
+ [:j| segments at: j put: (segments at: j + 1)].
+ self cCode: [] inSmalltalk: [segments at: numSegments - 1 put: SpurSegmentInfo new].
+ numSegments := numSegments - 1.
+
+ self bridgeFrom: (self addressOf: (segments at: i - 1))
+ to: (i <= (numSegments - 1) ifTrue: [self addressOf: (segments at: i)]).
+
+ manager setLastSegment: (self addressOf: (segments at: numSegments - 1))!
Item was added:
+ ----- Method: SpurSegmentManager>>shrinkObjectMemory: (in category 'growing/shrinking memory') -----
+ shrinkObjectMemory: delta
+ | shrinkage emptySeg |
+ <var: #emptySeg type: #'SegmentInfo *'>
+ shrinkage := delta.
+ [emptySeg := self findEmptySegNearestInSizeTo: shrinkage.
+ emptySeg notNil] whileTrue:
+ [shrinkage := shrinkage - emptySeg segSize.
+ manager detachFreeObject: (manager objectStartingAt: emptySeg segStart).
+ self removeSegment: emptySeg]!
More information about the Vm-dev
mailing list