Chromium Code Reviews| Index: src/mark-compact.h |
| diff --git a/src/mark-compact.h b/src/mark-compact.h |
| index 56be21fdd9d308c9c0e3f36c7cba336435b354fb..dee9bd0bb13dfbd61005c3d7474239581ce4137b 100644 |
| --- a/src/mark-compact.h |
| +++ b/src/mark-compact.h |
| @@ -106,6 +106,104 @@ class Marking { |
| } |
| } |
| + INLINE(static Address FirstMarkedObject(Page* p, |
| + uint32_t cell_index, |
| + uint32_t cell)) { |
| + ASSERT(cell != 0); |
| + uint32_t bit = __builtin_ctz(cell); |
|
Erik Corry
2011/01/19 13:46:48
We will need to make this work on non-gcc at some
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
I create separate class for compiler intrinsics.
|
| + return p->Markbit2Address( |
| + Page::MarkbitsBitmap::Cell2Index(cell_index) + bit); |
| + } |
| + |
| + INLINE(static Address FirstLiveObject(Address start, |
| + Address limit)) { |
| + ASSERT(!Heap::InNewSpace(start)); |
| + if (start >= limit) return start; |
| + |
| + Page* p = Page::FromAddress(start); |
|
Erik Corry
2011/01/19 13:46:48
can we call this variable page and the b variable
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + |
| + // Space above linearity boundary is continious. |
|
Erik Corry
2011/01/19 13:46:48
continious -> continuous
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + if (start >= p->linearity_boundary()) return start; |
|
Erik Corry
2011/01/19 13:46:48
how do we know an object starts here? This should
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + |
| + Page::MarkbitsBitmap* b = p->markbits(); |
| + uint32_t markbit = p->Address2Markbit(start); |
|
Erik Corry
2011/01/19 13:46:48
I'd prefer int instead of uint32_t. Firstly unsig
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
I prefer uint32_t. Having uint32_t there and int h
|
| + |
| + // If the start address is marked return it. |
| + if (b->Get(markbit)) return start; |
| + |
| + uint32_t* cells = b->cells(); |
| + uint32_t cell = Page::MarkbitsBitmap::Index2Cell(markbit); |
| + |
| + uint32_t last_cell = |
| + Page::MarkbitsBitmap::Index2Cell( |
| + Page::MarkbitsBitmap::CellAlignIndex( |
| + p->Address2Markbit(limit))); |
|
Erik Corry
2011/01/19 13:46:48
'To' is ! much longer than '2' and more clear2read
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + |
| + ASSERT(cell < last_cell); |
|
Erik Corry
2011/01/19 13:46:48
Comm /* comment */ ent?
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + |
| + while (cell < last_cell && cells[cell] == 0) cell++; |
| + |
| + if (cell == last_cell) return limit; |
| + |
| + return FirstMarkedObject(p, cell, cells[cell]); |
| + } |
| + |
| + INLINE(static Address NextLiveObject(HeapObject* obj, |
| + int size, |
| + Address end)) { |
| + ASSERT(!Heap::InNewSpace(obj)); |
| + Page* p = Page::FromAddress(obj->address()); |
| + Address watermark = p->linearity_boundary(); |
| + Address next_addr = obj->address() + size; |
| + |
| + if (next_addr >= watermark) return next_addr; |
| + |
| + Page::MarkbitsBitmap* b = p->markbits(); |
| + uint32_t markbit = p->Address2Markbit(next_addr); |
| + |
| + if (b->Get(markbit)) return next_addr; |
| + |
| + uint32_t* cells = b->cells(); |
| + uint32_t cell = Page::MarkbitsBitmap::Index2Cell(markbit); |
|
Erik Corry
2011/01/19 13:46:48
Again, it's an int. Can we call it cell_index to
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done.
|
| + |
| + ASSERT(IsMarked(obj)); |
| + |
| + uint32_t bit = Page::MarkbitsBitmap::Index2Bit(markbit); |
| + uint32_t mask = (~1) << bit; |
| + if ((cells[cell] & mask) != 0) { |
| + // There are more marked objects in this cell. |
| + return FirstMarkedObject(p, cell, cells[cell] & mask); |
| + } |
| + |
| + Address limit = Min(watermark, end); |
| + |
| + uint32_t last_cell = |
|
Erik Corry
2011/01/19 13:46:48
This is actually one past the last cell?
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Yes. This is frontier cell.
|
| + Page::MarkbitsBitmap::Index2Cell( |
| + Page::MarkbitsBitmap::CellAlignIndex( |
| + p->Address2Markbit(limit))); |
| + |
| + ASSERT(cell < last_cell); |
| + |
| + do { |
| + cell++; |
| + } while (cell < last_cell && cells[cell] == 0); |
| + |
| + if (cell == last_cell) return limit; |
| + |
| + return FirstMarkedObject(p, cell, cells[cell]); |
| + } |
| + |
| + static inline void TransferMark(Address old_start, |
| + Address new_start) { |
| + if (Heap::InNewSpace(old_start) || |
| + Page::FromAddress(old_start)->IsFlagSet(Page::IS_CONTINIOUS) || |
|
Erik Corry
2011/01/19 13:46:48
IS_CONTINIOUS -> IS_CONTINUOUS
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
Done everywhere.
|
| + !IsMarked(old_start)) { |
| + return; |
| + } |
| + |
| + SetMark(new_start); |
| + } |
| + |
| static bool Setup(); |
| static void TearDown(); |
| @@ -398,7 +496,10 @@ class MarkCompactCollector: public AllStatic { |
| static void SweepSpaces(); |
| static void SweepNewSpace(NewSpace* space); |
| - static void SweepSpace(PagedSpace* space); |
| + |
| + enum SweeperType { CONSERVATIVE, PRECISE }; |
|
Erik Corry
2011/01/19 13:46:48
The style guide allows kConservative and kPrecise.
Vyacheslav Egorov (Chromium)
2011/01/20 16:40:21
I prefer kX for non trivial constants.
XXX is for
|
| + |
| + static void SweepSpace(PagedSpace* space, SweeperType sweeper); |
| #ifdef DEBUG |
| // ----------------------------------------------------------------------- |