1234567891011121314151617181920212223242526272829303132333435363738394041424344454647open!Core(** Abstraction for a source of buffers to write trace data to.
At the moment this is used for the ability to both write to a file and to an in-memory
buffer for tests.
However I also tried to anticipate some of the structure of how the API would work
which would be required to write to a shared-memory transport involving a ring or
double-buffering system. *)moduletypeDestination=sig(** Called mainly when there isn't enough buffer space left to write a message of
[ensure_capacity] bytes and a new buffer is needed. May also be called in certain
other situations even if there's enough space in the previous buffer.
Any older buffers will no longer be used after calling this function, so it's legal
for a [Destination] to re-use [Iobuf.t]s to avoid allocating. *)valnext_buf:ensure_capacity:int->(read_write,Iobuf.seek)Iobuf.t(** Record that the writer appended a certain number of bytes to the buffer, will be
called some time after the bytes are written but before [next_buf] is called. *)valwrote_bytes:int->unit(** We will no longer be writing anything. Resources should be flushed and freed. *)valclose:unit->unitendmoduletypeArg_writers=sigtypettypestring_idvalstring:t->name:string_id->string_id->unitvalint32:t->name:string_id->int->unitvalint64:t->name:string_id->int->unitvalfloat:t->name:string_id->float->unitendmoduleTick_translation=structtypet={ticks_per_second:int;base_ticks:int;base_time:Time_ns.t}letepoch_ns={ticks_per_second=1_000_000_000;base_ticks=0;base_time=Time_ns.epoch};;end