12345678910111213141516171819202122232425262728293031323334353637moduleP=CatapultmoduleAtomic=P.Atomic_shim_(* store last time we emitted GC events *)letlast_gc:floatAtomic.t=Atomic.make(P.Clock.now_us())letemitting_gc=Atomic.makefalseletgc_interval_us=ref1e5letset_gc_interval_uss=gc_interval_us:=s(* emit a GC counter event *)let[@inlinenever]emit_gc_~pid()=letst=Gc.quick_stat()inP.Tracing.counter"gc"~cs:[Printf.sprintf"%d.major"pid,st.Gc.major_collections;Printf.sprintf"%d.minor"pid,st.Gc.minor_collections;Printf.sprintf"%d.compactions"pid,st.Gc.compactions;Printf.sprintf"%d.heap_words"pid,st.Gc.heap_words;(Printf.sprintf"%d.heap_MB"pid,st.Gc.heap_words*(Sys.word_size/8)/1024/1024);Printf.sprintf"%d.minor_words"pid,int_of_floatst.Gc.minor_words;]letmaybe_emit~now~pid()=letmust_emit_gc_=now-.Atomic.getlast_gc>!gc_interval_us&&(* NOTE: this is evaluated only if the interval condition is true,
and it has a side effect (setting "emitting_gc" to true).
Once we reach this point we must cleanup afterwards. *)not(Atomic.exchangeemitting_gctrue)inifmust_emit_gc_then(Atomic.setlast_gcnow;emit_gc_~pid();Atomic.setemitting_gcfalse)