From: <jik...@li...> - 2011-08-22 10:57:03
|
details: http://jikesrvm.hg.sourceforge.net/hgweb/jikesrvm/soc2011/rev/ebad9cd0e567 changeset: 10485:ebad9cd0e567 user: Shahar Timnat <st...@cs...> date: Mon Aug 22 13:56:48 2011 +0300 description: not using mark block, since it doesn't coexist with blocks' free-lists diffstat: MMTk/src/org/mmtk/plan/concurrent/marksweep/CMSTransitiveClosure.java | 1 + MMTk/src/org/mmtk/policy/CMSSpace.java | 33 ++++++++- MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java | 3 +- 3 files changed, 30 insertions(+), 7 deletions(-) diffs (111 lines): diff -r b3a96880313a -r ebad9cd0e567 MMTk/src/org/mmtk/plan/concurrent/marksweep/CMSTransitiveClosure.java --- a/MMTk/src/org/mmtk/plan/concurrent/marksweep/CMSTransitiveClosure.java Thu Aug 18 09:44:52 2011 +0300 +++ b/MMTk/src/org/mmtk/plan/concurrent/marksweep/CMSTransitiveClosure.java Mon Aug 22 13:56:48 2011 +0300 @@ -39,6 +39,7 @@ */ public void flush() { buffer.flushLocal(); + seqBuffer.flushLocal(); } diff -r b3a96880313a -r ebad9cd0e567 MMTk/src/org/mmtk/policy/CMSSpace.java --- a/MMTk/src/org/mmtk/policy/CMSSpace.java Thu Aug 18 09:44:52 2011 +0300 +++ b/MMTk/src/org/mmtk/policy/CMSSpace.java Mon Aug 22 13:56:48 2011 +0300 @@ -74,7 +74,7 @@ * for this block, or zero if there are no available cells. */ protected Address advanceToBlock(Address block, int sizeClass) { - if (inMSCollection) markBlock(block); + // if (inMSCollection) markBlock(block); - not marking blocks currently since it can't coexist with blocks free-lists. return BlockAllocator.getFreeListMeta(block); } @@ -128,25 +128,47 @@ } /** + * Sweep a block, freeing it and adding to the list given by availableHead + * if it contains no free objects. + * + * @param clearMarks should we clear block mark bits as we process. + */ + @Override + protected Address sweepBlock(Address block, int sizeClass, Extent blockSize, Address availableHead, boolean clearMarks) { + boolean liveBlock = addWhitesToFreeListInBlock(block, sizeClass, blockSize); + if (!liveBlock) { + BlockAllocator.setNext(block, Address.zero()); + BlockAllocator.free(this, block); + } else { + BlockAllocator.setNext(block, availableHead); + availableHead = block; + } + return availableHead; + } + + /** * Adds the white cells into the free list and nullify them. * * @param block The block address * @param sizeClass the sizeClass of the block * @param blockSize the size of the block + * @return true if at least one cell in the block contains a live object */ - @Override - protected void sweepCellsInBlock(Address block, int sizeClass, Extent blockSize) { + protected boolean addWhitesToFreeListInBlock(Address block, int sizeClass, Extent blockSize) { Address cursor = block.plus(blockHeaderSize[sizeClass]); Address firstFree = BlockAllocator.getFreeListMeta(block); Address end = block.plus(blockSize); Extent cellExtent = Extent.fromIntSignExtend(cellSize[sizeClass]); + boolean isLiveBlock = false; + byte markBits; while (cursor.LT(end)) { ObjectReference current = VM.objectModel.getObjectFromStartAddress(cursor); boolean white = false; if (!current.isNull()) { + markBits = CMSHeader.getMarkBits(current); + isLiveBlock = isLiveBlock || markBits == CMSHeader.black; white = CMSHeader.getMarkBits(current) == CMSHeader.white; if (VM.VERIFY_ASSERTIONS) { - byte markBits = CMSHeader.getMarkBits(current); VM.assertions._assert(markBits==CMSHeader.white || markBits==CMSHeader.black || markBits==CMSHeader.blue/*, String.valueOf(markBits)*/); } } @@ -166,6 +188,7 @@ cursor = cursor.plus(cellExtent); } BlockAllocator.setFreeListMeta(block, firstFree); + return isLiveBlock; } @@ -209,7 +232,7 @@ @Inline public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { if (CMSHeader.getMarkBits(object) == CMSHeader.white) { - markBlock(object); + // markBlock(object); - not marking blocks currently since it can't coexist with blocks free-lists. trace.processNode(object); CMSHeader.setMarkBits(object, CMSHeader.grey); } diff -r b3a96880313a -r ebad9cd0e567 MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java --- a/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java Thu Aug 18 09:44:52 2011 +0300 +++ b/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java Mon Aug 22 13:56:48 2011 +0300 @@ -516,7 +516,7 @@ * * @param clearMarks should we clear block mark bits as we process. */ - protected final Address sweepBlock(Address block, int sizeClass, Extent blockSize, Address availableHead, boolean clearMarks) { + protected Address sweepBlock(Address block, int sizeClass, Extent blockSize, Address availableHead, boolean clearMarks) { boolean liveBlock = containsLiveCell(block, blockSize, clearMarks); if (!liveBlock) { BlockAllocator.setNext(block, Address.zero()); @@ -532,7 +532,6 @@ /** * * Does nothing if we use lazy sweeping, otherwise sets the free-list. - * overriden in CMSSpace. * * @param block The block address * @param sizeClass the sizeClass of the block |