123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103open!CoremoduleWriter=Tracing_zero.WritermoduleEvent_type=Writer.Expert.Event_typemoduleBuffer_until_initialized=Tracing_zero.Destinations.Buffer_until_initializedletglobal_dest=Buffer_until_initialized.create()lettick_translation=letcalibrator=Lazy.forceTime_stamp_counter.calibratorin(* Only fails when on a 32 bit platform is detected, which we don't deploy any of *)letmhz_est=(Or_error.ok_exnTime_stamp_counter.Calibrator.cpu_mhz)calibratorinletticks_per_second=Float.to_int(mhz_est*.1E6)inletbase_tsc=Time_stamp_counter.now()inletbase_ticks=base_tsc|>Time_stamp_counter.to_int63|>Int63.to_int_exninletbase_time=Time_stamp_counter.to_time_ns~calibratorbase_tscin{Writer.Tick_translation.ticks_per_second;base_ticks;base_time};;letglobal_writer=letdestination=Buffer_until_initialized.to_destinationglobal_destinletw=Writer.Expert.create~destination()inWriter.write_tick_initializationwtick_translation;w;;letmain_thread=Writer.set_thread_slotglobal_writer~slot:0~pid:1~tid:2letset_destinationdest=Buffer_until_initialized.set_destinationglobal_destdest;(* This isn't strictly necessary but it avoids a latency spike from the copy when the
temp buffer gets filled up, and makes sure that we're writing to a buffer that at
least has some chance of surviving a crash. *)Writer.Expert.force_switch_buffersglobal_writer;;letclose()=Writer.closeglobal_writermoduleEvent=structtypet=Writer.Expert.headerletcreate_duration~arg_types~category~name=letcategory=Writer.intern_stringglobal_writercategoryinletname=Writer.intern_stringglobal_writernameinletbegin_header=Writer.Expert.precompute_header~event_type:Event_type.duration_begin~extra_words:0~arg_types~thread:main_thread~category~nameinletend_header=Writer.Expert.precompute_header~event_type:Event_type.duration_end~extra_words:0~arg_types:Writer.Arg_types.none~thread:main_thread~category~nameinbegin_header,end_header;;letcreate_event~event_type~arg_types~category~name~extra_words=letcategory=Writer.intern_stringglobal_writercategoryinletname=Writer.intern_stringglobal_writernameinletheader=Writer.Expert.precompute_header~event_type~extra_words~arg_types~thread:main_thread~category~nameinheader;;letcreate_instant=create_event~event_type:Event_type.instant~extra_words:0letcreate_duration_begin=create_event~event_type:Event_type.duration_begin~extra_words:0;;letcreate_duration_end=create_event~event_type:Event_type.duration_end~extra_words:0;;letcreate_duration_instant=create_event~event_type:Event_type.duration_complete~extra_words:1;;letwriteheader=Writer.Expert.write_from_header_with_tscglobal_writer~headerletwrite_and_get_tscheader=Writer.Expert.write_from_header_and_get_tscglobal_writer~header;;endmoduleFor_testing=structlettick_translation=tick_translationend