… | |
… | |
1656 | /* garbage collect */ |
1656 | /* garbage collect */ |
1657 | clrmark (NIL); |
1657 | clrmark (NIL); |
1658 | SCHEME_V->fcells = 0; |
1658 | SCHEME_V->fcells = 0; |
1659 | SCHEME_V->free_cell = NIL; |
1659 | SCHEME_V->free_cell = NIL; |
1660 | |
1660 | |
1661 | /* free-list is kept sorted by address so as to maintain consecutive |
1661 | uint32_t total = 0; |
1662 | ranges, if possible, for use with vectors. Here we scan the cells |
1662 | |
1663 | (which are also kept sorted by address) downwards to build the |
1663 | /* Here we scan the cells to build the free-list. */ |
1664 | free-list in sorted order. |
|
|
1665 | */ |
|
|
1666 | for (i = SCHEME_V->last_cell_seg; i >= 0; i--) |
1664 | for (i = SCHEME_V->last_cell_seg; i >= 0; i--) |
1667 | { |
1665 | { |
1668 | p = SCHEME_V->cell_seg[i] + SCHEME_V->cell_segsize [i]; |
1666 | pointer end = SCHEME_V->cell_seg[i] + SCHEME_V->cell_segsize [i]; |
|
|
1667 | total += SCHEME_V->cell_segsize [i]; |
1669 | |
1668 | |
1670 | while (--p >= SCHEME_V->cell_seg[i]) |
1669 | for (p = SCHEME_V->cell_seg[i]; p < end; ++p) |
1671 | { |
1670 | { |
1672 | if (is_mark (p)) |
1671 | if (is_mark (p)) |
1673 | clrmark (p); |
1672 | clrmark (p); |
1674 | else |
1673 | else |
1675 | { |
1674 | { |
… | |
… | |
1688 | } |
1687 | } |
1689 | } |
1688 | } |
1690 | |
1689 | |
1691 | if (SCHEME_V->gc_verbose) |
1690 | if (SCHEME_V->gc_verbose) |
1692 | { |
1691 | { |
1693 | xwrstr ("done: "); xwrnum (SCHEME_V->fcells); xwrstr (" cells were recovered.\n"); |
1692 | xwrstr ("done: "); xwrnum (SCHEME_V->fcells); xwrstr (" out of "); xwrnum (total); xwrstr (" cells were recovered.\n"); |
1694 | } |
1693 | } |
1695 | } |
1694 | } |
1696 | |
1695 | |
1697 | static void |
1696 | static void |
1698 | finalize_cell (SCHEME_P_ pointer a) |
1697 | finalize_cell (SCHEME_P_ pointer a) |