]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: add marking as a timed gc phase
authorBjörn Lindqvist <bjourne@gmail.com>
Thu, 20 Oct 2016 05:46:21 +0000 (07:46 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Thu, 20 Oct 2016 05:46:21 +0000 (07:46 +0200)
I think that makes sense because most time when doing a full gc is spent
marking.

basis/tools/memory/memory.factor
basis/vm/vm.factor
vm/full_collector.cpp
vm/gc.hpp

index e07de9bbfb6963c7d455ee74efbd2536292577e6..3dc4100c4ba7079c4d8da2c976442f53846a2683 100644 (file)
@@ -197,6 +197,7 @@ SYMBOL: gc-events
         { "Total time:" [ [ total-time>> ] map-sum nanos>string ] }
         { "Card scan time:" [ PHASE-CARD-SCAN sum-phase-times ] }
         { "Code block scan time:" [ PHASE-CODE-SCAN sum-phase-times ] }
+        { "Marking time:" [ PHASE-MARKING sum-phase-times ] }
         { "Data heap sweep time:" [ PHASE-DATA-SWEEP sum-phase-times ] }
         { "Code heap sweep time:" [ PHASE-CODE-SWEEP sum-phase-times ] }
         { "Data compaction time:" [ PHASE-DATA-COMPACTION sum-phase-times ] }
index 4b89fa6f98479c4417923c8883b3fefb823afd8d..0b7dbfe6bc9eff5ab30b55bd267714f71debdda6 100644 (file)
@@ -86,6 +86,7 @@ CONSTANT: PHASE-CODE-SCAN 1
 CONSTANT: PHASE-DATA-SWEEP 2
 CONSTANT: PHASE-CODE-SWEEP 3
 CONSTANT: PHASE-DATA-COMPACTION 4
+CONSTANT: PHASE-MARKING 5
 
 ! gc-event should be kept in sync with:
 !   vm/gc.hpp
@@ -100,7 +101,7 @@ STRUCT: gc-event
     { code-blocks-scanned cell_t }
     { start-time ulonglong }
     { total-time cell_t }
-    { times cell_t[5] }
+    { times cell_t[6] }
     { temp-time ulonglong } ;
 
 ! gc-info should be kept in sync with:
index 3c87cdb6d107b3b1d400169fca6f23f780d47b12..58f352d2f3676f6d6853e6744f0975f9f0a0b07f 100644 (file)
@@ -57,6 +57,10 @@ struct full_collection_copier : no_fixup {
 };
 
 void factor_vm::collect_mark_impl() {
+  gc_event* event = current_gc->event;
+  if (event)
+    event->reset_timer();
+
   slot_visitor<full_collection_copier>
       visitor(this, full_collection_copier(data->tenured, code, &mark_stack));
 
@@ -75,11 +79,13 @@ void factor_vm::collect_mark_impl() {
   data->reset_aging();
   data->reset_nursery();
   code->clear_remembered_set();
+
+  if (event)
+    event->ended_phase(PHASE_MARKING);
 }
 
 void factor_vm::collect_sweep_impl() {
   gc_event* event = current_gc->event;
-
   if (event)
     event->reset_timer();
   data->tenured->sweep();
index 09414155803634c457b934f994e430190cd429ce..b28038e8029fd6e89f1126802da4e8f81623551d 100644 (file)
--- a/vm/gc.hpp
+++ b/vm/gc.hpp
@@ -19,6 +19,7 @@ enum gc_phase {
   PHASE_DATA_SWEEP,
   PHASE_CODE_SWEEP,
   PHASE_DATA_COMPACTION,
+  PHASE_MARKING
 };
 
 struct gc_event {
@@ -32,7 +33,7 @@ struct gc_event {
   cell code_blocks_scanned;
   uint64_t start_time;
   cell total_time;
-  cell times[5];
+  cell times[6];
   uint64_t temp_time;
 
   gc_event(gc_op op, factor_vm* parent);