VM Maker: VMMaker.oscog-eem.707.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.707.mcz

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

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

Name: VMMaker.oscog-eem.707
Author: eem
Time: 7 May 2014, 10:28:39.678 am
UUID: 47db026e-b2fc-49b3-9937-d35b926a9522
Ancestors: VMMaker.oscog-eem.706

Fix the assert fail on pigCompact.  Since pastSpace is not
voided, pastSpace must be swept to follow forwarders.

Refactor mapMachineCode to mapMachineCode: theGCMode
and hence call mapMachineCode: GCModeFull in
eliminateAndFreeForwardersFor[Fit|Pig]Compact.

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

Item was added:
+ ----- Method: CoInterpreter>>getGCMode (in category 'object memory support') -----
+ getGCMode
+ ^gcMode!

Item was removed:
- ----- Method: CoInterpreter>>mapMachineCode (in category 'object memory support') -----
- mapMachineCode
- "Update all references to objects in machine code."
- cogit mapObjectReferencesInMachineCode: gcMode!

Item was added:
+ ----- Method: CoInterpreter>>mapMachineCode: (in category 'object memory support') -----
+ mapMachineCode: theGCMode
+ <inline: true>
+ "Update all references to objects in machine code."
+ cogit mapObjectReferencesInMachineCode: theGCMode!

Item was changed:
  ----- Method: SpurGenerationScavenger>>futureSurvivorStart (in category 'accessing') -----
  futureSurvivorStart
+ <cmacro: '() GIV(futureSurvivorStart)'>
  ^futureSurvivorStart!

Item was added:
+ ----- 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>>allPastSpaceObjectsDo: (in category 'object enumeration') -----
+ allPastSpaceObjectsDo: aBlock
+ "Enumerate all past space objects, excluding free objects."
+ <inline: true>
+ self allPastSpaceEntitiesDo:
+ [:objOop|
+ self assert: (self isEnumerableObjectNoAssert: objOop).
+ aBlock value: objOop]!

Item was changed:
  ----- Method: SpurMemoryManager>>eliminateAndFreeForwardersForFitCompact (in category 'gc - global') -----
  eliminateAndFreeForwardersForFitCompact
  "As the final phase of global garbage collect, sweep the heap to follow
  forwarders, then free forwarders, coalescing with free space as we go."
  | lowestFree |
  <inline: false>
  self flag: 'this might be unnecessary.  if we were to track firstFreeChunk we might be able to repeat the freeUnmarkedObjectsAndSortAndCoalesceFreeSpace; compact cycle until firstFreeChunk reaches a fixed point'.
  self assert: (self isForwarded: nilObj) not.
  self assert: (self isForwarded: falseObj) not.
  self assert: (self isForwarded: trueObj) not.
  self assert: (self isForwarded: self freeListsObj) not.
  self assert: (self isForwarded: hiddenRootsObj) not.
  self assert: (self isForwarded: classTableFirstPage) not.
  self followSpecialObjectsOop.
  "N.B. we don't have to explicitly do mapInterpreterOops since the scavenge below
  will do it, except that scavenging maps only young references in machine code."
  self followForwardedObjStacks.
  scavenger followRememberedForwardersAndForgetFreeObjects.
  self doScavenge: DontTenureButDoUnmark.
+ coInterpreter mapMachineCode: GCModeFull.
- coInterpreter mapMachineCode.
  self checkFreeSpace.
  lowestFree := self sweepToFollowForwardersForFitCompact.
  self checkFreeSpace.
  lowestFree = 0 ifTrue: "yeah, right..."
  [^self].
  self sweepToCoallesceFreeSpaceAndRebuildFreeListsForFitCompactFrom: lowestFree.
  self checkFreeSpace!

Item was changed:
  ----- Method: SpurMemoryManager>>eliminateAndFreeForwardersForPigCompact (in category 'gc - global') -----
  eliminateAndFreeForwardersForPigCompact
  "As the final phase of global garbage collect, sweep the heap to follow
  forwarders, then free forwarders, coalescing with free space as we go."
  <inline: false>
  | lowestForwarder |
  self assert: (self isForwarded: nilObj) not.
  self assert: (self isForwarded: falseObj) not.
  self assert: (self isForwarded: trueObj) not.
  self assert: (self isForwarded: self freeListsObj) not.
  self assert: (self isForwarded: hiddenRootsObj) not.
  self assert: (self isForwarded: classTableFirstPage) not.
  self followSpecialObjectsOop.
  "N.B. we don't have to explicitly do mapInterpreterOops since the scavenge below
  will do it, except that scavenging maps only young references in machine code."
  self followForwardedObjStacks.
  scavenger followRememberedForwardersAndForgetFreeObjectsForPigCompact.
  "Because of the flushEden before markObjects the scavenge /should not/
  tenure. In fact it must not because the free list has not been rebuilt, so
  there is no space, and any attempt to tenure will allocate a new segment."
  totalFreeOldSpace := 0.
  self doScavenge: DontTenureButDoUnmark.
  self assert: totalFreeOldSpace = 0.
+ coInterpreter mapMachineCode: GCModeFull.
- coInterpreter mapMachineCode.
  lowestForwarder := self sweepToFollowForwardersForPigCompact.
  self sweepToCoallesceFreeSpaceAndRebuildFreeListsForPigCompactFrom: lowestForwarder.
  self checkFreeSpace.
  self assert: self numberOfForwarders = 0!

Item was changed:
  ----- Method: SpurMemoryManager>>sweepToFollowForwardersForPigCompact (in category 'compaction') -----
  sweepToFollowForwardersForPigCompact
  "Sweep, following forwarders in all live objects.
+ Answer the lowest forwarder in oldSpace."
- Answer the lowest forwarder."
  | lowestForwarder |
+ self assert: (freeStart = scavenger eden start
+  and: [scavenger futureSurvivorStart = scavenger futureSpace start]).
+ self allPastSpaceObjectsDo:
+ [:o|
+ (self isForwarded: o) ifFalse:
+ [0 to: (self numPointerSlotsOf: o) - 1 do:
+ [:i| | f |
+ f := self fetchPointer: i ofObject: o.
+ (self isOopForwarded: f) ifTrue:
+ [f := self followForwarded: f.
+ self storePointerUnchecked: i ofObject: o withValue: f]]]].
  lowestForwarder := 0.
  self allOldSpaceObjectsDo:
  [:o|
  (self isForwarded: o)
  ifTrue:
  [lowestForwarder = 0 ifTrue:
  [lowestForwarder := 0]]
  ifFalse:
  [0 to: (self numPointerSlotsOf: o) - 1 do:
  [:i| | f |
  f := self fetchPointer: i ofObject: o.
  (self isOopForwarded: f) ifTrue:
  [f := self followForwarded: f.
  self storePointer: i ofObject: o withValue: f]]]].
  ^lowestForwarder!

Item was added:
+ ----- Method: StackInterpreter>>getGCMode (in category 'object memory support') -----
+ getGCMode
+ "This is a no-op in the StackVM"
+ ^0!

Item was changed:
  ----- Method: StackInterpreter>>mapInterpreterOops (in category 'object memory support') -----
  mapInterpreterOops
  "Map all oops in the interpreter's state to their new values
  during garbage collection or a become: operation."
  "Assume: All traced variables contain valid oops."
  <inline: false>
  self mapStackPages.
+ self mapMachineCode: self getGCMode.
- self mapMachineCode.
  self mapTraceLogs.
  self mapVMRegisters.
  self mapProfileState.
  self remapCallbackState.
  (tempOop ~= 0
  and: [objectMemory shouldRemapOop: tempOop]) ifTrue:
  [tempOop := objectMemory remapObj: tempOop]!

Item was removed:
- ----- Method: StackInterpreter>>mapMachineCode (in category 'object memory support') -----
- mapMachineCode
- "This is a no-op in the StackVM"!

Item was added:
+ ----- Method: StackInterpreter>>mapMachineCode: (in category 'object memory support') -----
+ mapMachineCode: theGCMode
+ <inline: true>
+ "This is a no-op in the StackVM"!