[Vm-dev] VM Maker: VMMaker.oscog-eem.1867.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu May 26 04:41:05 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1867.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1867
Author: eem
Time: 25 May 2016, 9:38:19.765577 pm
UUID: 17d41c8f-18a0-4dd0-8b35-1eba4ffa1d53
Ancestors: VMMaker.oscog-eem.1866
Fixes for ephemerons.
Fix bug in markAllUnscannedEphemerons. Now Gille's test case works for 50k elements, but not yet for 200k.
Fix asserts in various functions.
=============== Diff against VMMaker.oscog-eem.1866 ===============
Item was changed:
----- Method: SpurGenerationScavenger>>fireEphemeronsOnEphemeronList (in category 'weakness and ephemerality') -----
fireEphemeronsOnEphemeronList
"There are ephemerons to be fired in the remembered set.
Fire them and scavenge their keys. Be careful since copyAndForward:
can remember ephemerons (ephemerons pointing to ephemerons)."
| ephemeron ephemeronCorpse key oldList oldCorpse | "old ones for debugging"
ephemeronList ifNil:
[^self].
oldCorpse := nil.
ephemeronCorpse := self firstCorpse: ephemeronList.
"Reset the list head so that new ephemerons will get added
to a new list, not concatenated on the one we are scanning."
oldList := ephemeronList.
ephemeronList := nil.
+ [ephemeronCorpse notNil] whileTrue:
+ [self assert: ((manager isYoung: ephemeronCorpse) and: [manager isForwarded: ephemeronCorpse]).
- [self assert: (manager isYoung: ephemeronCorpse).
- ephemeronCorpse notNil] whileTrue:
- [self assert: (manager isForwarded: ephemeronCorpse).
ephemeron := manager followForwarded: ephemeronCorpse.
key := manager keyOfMaybeFiredEphemeron: ephemeron.
(self isScavengeSurvivor: key) ifFalse:
[coInterpreter fireEphemeron: ephemeron.
manager
storePointerUnchecked: 0
ofObject: ephemeron
withValue: (self copyAndForward: key)].
"Fired ephemerons should have had their format changed."
self deny: ((self isScavengeSurvivor: key) and: [manager isEphemeron: ephemeron]).
self cCoerceSimple: (self scavengeReferentsOf: ephemeron) to: #void.
oldCorpse := ephemeronCorpse.
ephemeronCorpse := self nextCorpseOrNil: ephemeronCorpse]!
Item was changed:
----- Method: SpurMemoryManager>>allUnscannedEphemeronsAreActive (in category 'weakness and ephemerality') -----
allUnscannedEphemeronsAreActive
unscannedEphemerons start to: unscannedEphemerons top - self bytesPerOop by: self bytesPerOop do:
[:p| | key |
+ key := self keyOfMaybeFiredEphemeron: (self longAt: p).
- key := self keyOfEphemeron: (self longAt: p).
((self isImmediate: key) or: [self isMarked: key]) ifTrue:
[^false]].
^true!
Item was added:
+ ----- Method: SpurMemoryManager>>followedKeyOfMaybeFiredEphemeron: (in category 'object access') -----
+ followedKeyOfMaybeFiredEphemeron: objOop
+ "Answer the object the ephemeron guards. This is its first element."
+ self assert: ((self isNonImmediate: objOop) and: [self isMaybeFiredEphemeron: objOop]).
+ ^self followOopField: 0 ofObject: objOop!
Item was changed:
----- Method: SpurMemoryManager>>is:onObjStack: (in category 'obj stacks') -----
is: oop onObjStack: objStack
<inline: false>
| index nextPage |
+ objStack = nilObj ifTrue:
+ [^false].
self assert: (self numSlotsOfAny: objStack) = ObjStackPageSlots.
"There are four fixed slots in an obj stack, and a Topx of 0 indicates empty, so
if there were 6 slots in an oop stack, full would be 2, and the last 0-rel index is 5."
index := (self fetchPointer: ObjStackTopx ofObject: objStack) + ObjStackNextx.
[index >= ObjStackFixedSlots] whileTrue:
[oop = (self fetchPointer: index ofObject: objStack) ifTrue:
[^true].
index := index - 1].
nextPage := self fetchPointer: ObjStackNextx ofObject: objStack.
nextPage ~= 0 ifTrue:
[(self is: oop onObjStack: nextPage) ifTrue:
[^true]].
^false!
Item was changed:
----- Method: SpurMemoryManager>>markAllUnscannedEphemerons (in category 'weakness and ephemerality') -----
markAllUnscannedEphemerons
"After firing the unscanned ephemerons we must scan-mark them.
+ The wrinkle is that doing so may add more ephemerons to the set.
+ So we remove the first element, by overwriting it with the last element,
+ and decrementing the top, and then markAndTrace its contents."
- The wrinkle is that doing so may add more ephemerons to the set."
- | ptr |
self assert: (self noUnscannedEphemerons) not.
self assert: self allUnscannedEphemeronsAreActive.
+ [unscannedEphemerons top > unscannedEphemerons start] whileTrue:
+ [| ephemeron key lastptr |
+ ephemeron := self longAt: unscannedEphemerons start.
+ lastptr := unscannedEphemerons top - self bytesPerOop.
+ lastptr > unscannedEphemerons start ifTrue:
+ [self longAt: unscannedEphemerons start put: (self longAt: lastptr)].
+ unscannedEphemerons top: lastptr.
+ key := self followedKeyOfMaybeFiredEphemeron: ephemeron.
+ self setIsMarkedOf: ephemeron to: false. "to get it to be fully scanned in markAndTrace:"
- ptr := unscannedEphemerons top - self wordSize.
- [ptr >= unscannedEphemerons start] whileTrue:
- [| ephemeron key |
- key := self followedKeyOfEphemeron: (ephemeron := self longAt: ptr).
self
markAndTrace: key;
+ markAndTrace: ephemeron]!
- markAndTrace: ephemeron.
- unscannedEphemerons top: unscannedEphemerons top - self bytesPerOop.
- ptr < unscannedEphemerons top ifTrue:
- ["not the last entry; remove it by overwriting it with the last
- ephemeron (which must have been newly added by markAndTrace:)."
- self longAt: ptr put: (self longAt: unscannedEphemerons top)].
- ptr := ptr - self bytesPerOop]!
Item was changed:
----- Method: SpurMemoryManager>>noCheckPush:onObjStack: (in category 'obj stacks') -----
noCheckPush: objOop onObjStack: objStack
"Push an element on an objStack. Split from push:onObjStack: for testing."
| topx |
self eassert: [self isValidObjStack: objStack].
+ self cCode: '' "for debugging markAndTrace: set (MarkStackRecord := OrderedCollection new)"
- self cCode: [] "for debugging markAndTrace: set (MarkStackRecord := OrderedCollection new)"
inSmalltalk:
+ [MarkStackRecord ifNotNil:
+ [(self fetchPointer: ObjStackMyx ofObject: objStack) = MarkStackRootIndex ifTrue:
+ [MarkStackRecord addLast: {#push. objOop}]]].
- [(self fetchPointer: ObjStackMyx ofObject: objStack) = MarkStackRootIndex ifTrue:
- [MarkStackRecord ifNotNil: [MarkStackRecord addLast: {#push. objOop}]]].
topx := self fetchPointer: ObjStackTopx ofObject: objStack.
topx >= ObjStackLimit
ifTrue:
[self noCheckPush: objOop
onObjStack: (self ensureRoomOnObjStackAt: (self fetchPointer: ObjStackMyx ofObject: objStack))]
ifFalse:
[self storePointer: ObjStackFixedSlots + topx ofObjStack: objStack withValue: objOop.
self storePointer: ObjStackTopx ofObjStack: objStack withValue: topx + 1].
^objOop!
Item was changed:
----- Method: SpurMemoryManager>>queueMourner: (in category 'weakness and ephemerality') -----
queueMourner: anEphemeronOrWeakArray
"Add the ephemeron to the queue and make it non-ephemeral, to avoid subsequent firing.
Alas this means that other ephemerons on the same object not identified in this sccavenge
or GC will not fire until later. But that's life."
self assert: ((self isNonImmediate: anEphemeronOrWeakArray)
and: [(self formatOf: anEphemeronOrWeakArray) = self ephemeronFormat
or: [(self formatOf: anEphemeronOrWeakArray) = self weakArrayFormat]]).
+ self deny: (self is: anEphemeronOrWeakArray onObjStack: mournQueue).
- self deny: (mournQueue ~= nilObj
- and: [self is: anEphemeronOrWeakArray onObjStack: mournQueue]).
self ensureRoomOnObjStackAt: MournQueueRootIndex.
+ self push: anEphemeronOrWeakArray onObjStack: mournQueue!
- self push: anEphemeronOrWeakArray onObjStack: mournQueue.
- (self formatOf: anEphemeronOrWeakArray) = self ephemeronFormat ifTrue:
- [self setFormatOf: anEphemeronOrWeakArray to: self nonIndexablePointerFormat]!
Item was changed:
----- Method: StackInterpreter>>fireEphemeron: (in category 'finalization') -----
fireEphemeron: ephemeron
<option: #SpurObjectMemory>
+ objectMemory queueMourner: ephemeron..
+ self setFormatOf: ephemeron to: self nonIndexablePointerFormat.
- objectMemory queueMourner: ephemeron.
self signalFinalization: ephemeron!
More information about the Vm-dev
mailing list