/vm/aging_collector.cpp

http://github.com/abeaumont/factor · C++ · 56 lines · 37 code · 14 blank · 5 comment · 4 complexity · eacdec5916eeea82c591e7f88b04082f MD5 · raw file

  1. #include "master.hpp"
  2. namespace factor
  3. {
  4. aging_collector::aging_collector(factor_vm *parent_) :
  5. copying_collector<aging_space,aging_policy>(
  6. parent_,
  7. parent_->data->aging,
  8. aging_policy(parent_)) {}
  9. void factor_vm::collect_aging()
  10. {
  11. /* Promote objects referenced from tenured space to tenured space, copy
  12. everything else to the aging semi-space, and reset the nursery pointer. */
  13. {
  14. /* Change the op so that if we fail here, an assertion will be
  15. raised. */
  16. current_gc->op = collect_to_tenured_op;
  17. to_tenured_collector collector(this);
  18. gc_event *event = current_gc->event;
  19. if(event) event->started_card_scan();
  20. collector.trace_cards(data->tenured,
  21. card_points_to_aging,
  22. full_unmarker());
  23. if(event) event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
  24. if(event) event->started_code_scan();
  25. collector.trace_code_heap_roots(&code->points_to_aging);
  26. if(event) event->ended_code_scan(collector.code_blocks_scanned);
  27. collector.tenure_reachable_objects();
  28. }
  29. {
  30. /* If collection fails here, do a to_tenured collection. */
  31. current_gc->op = collect_aging_op;
  32. std::swap(data->aging,data->aging_semispace);
  33. data->reset_generation(data->aging);
  34. aging_collector collector(this);
  35. collector.trace_roots();
  36. collector.trace_contexts();
  37. collector.cheneys_algorithm();
  38. data->reset_generation(&nursery);
  39. code->clear_remembered_set();
  40. }
  41. }
  42. }