123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294typeid=inttypeobj_ty=|Promise|Semaphore|Stream|Mutexletobj_ty_to_uint8=function|Promise->15|Semaphore->16|Stream->18|Mutex->19letobj_ty_of_uint8=function|15->Promise|16->Semaphore|18->Stream|19->Mutex|_->assertfalseletobj_ty_to_string(t:obj_ty)=matchtwith|Promise->"promise"|Semaphore->"semaphore"|Stream->"stream"|Mutex->"mutex"typecc_ty=|Switch|Protect|Sub|Root|Anyletcc_ty_to_uint8=function|Switch->3|Protect->4|Sub->5|Root->6|Any->7letcc_ty_of_uint8=function|3->Switch|4->Protect|5->Sub|6->Root|7->Any|_->assertfalseletcc_ty_to_string=function|Switch->"switch"|Protect->"protect"|Sub->"sub"|Root->"root"|Any->"any"letstring=letencodebufs=letlen=min(Bytes.lengthbuf)(String.lengths)inBytes.blit_strings0buf0len;leninletdecodebuflen=Bytes.sub_stringbuf0leninRuntime_events.Type.register~encode~decodeletid_obj_type=letencodebuf(id,ty)=Bytes.set_int64_lebuf0(Int64.of_intid);Bytes.set_int8buf8(obj_ty_to_uint8ty);9inletdecodebuf_size=letid=Bytes.get_int64_lebuf0|>Int64.to_intinletty=obj_ty_of_uint8(Bytes.get_int8buf8)in(id,ty)inRuntime_events.Type.register~encode~decodeletid_id_type=letencodebuf(id1,id2)=Bytes.set_int64_lebuf0(Int64.of_intid1);Bytes.set_int64_lebuf8(Int64.of_intid2);16inletdecodebuf_size=letid1=Bytes.get_int64_lebuf0|>Int64.to_intinletid2=Bytes.get_int64_lebuf8|>Int64.to_intin(id1,id2)inRuntime_events.Type.register~encode~decodeletid_cc_type=letencodebuf(id,ty)=Bytes.set_int64_lebuf0(Int64.of_intid);Bytes.set_int8buf8(cc_ty_to_uint8ty);9inletdecodebuf_size=letid=Bytes.get_int64_lebuf0|>Int64.to_intinletty=cc_ty_of_uint8(Bytes.get_int8buf8)in(id,ty)inRuntime_events.Type.register~encode~decodeletid_string_type=letencodebuf(id,msg)=(* Check size of buf and use smallest size which means we may
have to truncate the label. *)letavailable_buf_len=Bytes.lengthbuf-8inletmsg_len=String.lengthmsginletdata_len=minavailable_buf_lenmsg_leninBytes.set_int64_lebuf0(Int64.of_intid);Bytes.blit_stringmsg0buf8data_len;data_len+8inletdecodebufsize=letid=Bytes.get_int64_lebuf0|>Int64.to_intin(id,Bytes.sub_stringbuf8(size-8))inRuntime_events.Type.register~encode~decodeletexn_type=letencodebuf(id,exn)=(* Check size of buf and use smallest size which means we may
have to truncate the label. *)letavailable_buf_len=Bytes.lengthbuf-8inletmsg=Printexc.to_stringexninletmsg_len=String.lengthmsginletdata_len=minavailable_buf_lenmsg_leninBytes.set_int64_lebuf0(Int64.of_intid);Bytes.blit_stringmsg0buf8data_len;data_len+8inletdecodebufsize=letid=Bytes.get_int64_lebuf0|>Int64.to_intin(id,Failure(Bytes.sub_stringbuf8(size-8)))inRuntime_events.Type.register~encode~decode(* Runtime events registration *)typeRuntime_events.User.tag+=|Create_obj|Create_fiber|Get|Create_cc|Try_get|Put|Error|Exit_cc|Exit_fiber|Name|Log|Enter_span|Exit_span|Suspend_fiber|Fiber|Suspend_domain|Domain_spawnletcreate_obj=Runtime_events.User.register"eio.create_obj"Create_objid_obj_typeletcreate_cc=Runtime_events.User.register"eio.create_cc"Create_ccid_cc_typeletcreate_fiber=Runtime_events.User.register"eio.create_fiber"Create_fiberid_id_typeletget=Runtime_events.User.register"eio.get"GetRuntime_events.Type.intlettry_get=Runtime_events.User.register"eio.try_get"Try_getRuntime_events.Type.intletput=Runtime_events.User.register"eio.put"PutRuntime_events.Type.intletexit_cc=Runtime_events.User.register"eio.exit_cc"Exit_ccRuntime_events.Type.unitletexit_fiber=Runtime_events.User.register"eio.exit_fiber"Exit_fiberRuntime_events.Type.intleterror=Runtime_events.User.register"eio.error"Errorexn_typeletname=Runtime_events.User.register"eio.name"Nameid_string_typeletlog=Runtime_events.User.register"eio.log"Logstringletenter_span=Runtime_events.User.register"eio.enter_span"Enter_spanstringletexit_span=Runtime_events.User.register"eio.exit_span"Exit_spanRuntime_events.Type.unitletfiber=Runtime_events.User.register"eio.fiber"FiberRuntime_events.Type.intletsuspend_fiber=Runtime_events.User.register"eio.suspend_fiber"Suspend_fiberstringletsuspend_domain=Runtime_events.User.register"eio.suspend_domain"Suspend_domainRuntime_events.Type.spanletdomain_spawn=Runtime_events.User.register"eio.domain_spawn"Domain_spawnRuntime_events.Type.inttypeevent=[|`Createofid*[|`Fiber_inofid|`Ccofcc_ty|`Objofobj_ty]|`Fiberofid|`Nameofid*string|`Logofstring|`Enter_spanofstring|`Exit_span|`Getofid|`Try_getofid|`Putofid|`Errorof(id*string)|`Exit_cc|`Exit_fiberofid|`Suspend_domainofRuntime_events.Type.span|`Suspend_fiberofstring|`Domain_spawnofid]letpf=Format.fprintfletpp_eventf(e:event)=matchewith|`Create(id,`Fiber_incc)->pff"create fiber %d in CC %d"idcc|`Create(id,`Ccty)->pff"create %s CC %d"(cc_ty_to_stringty)id|`Create(id,`Objty)->pff"create %s %d"(obj_ty_to_stringty)id|`Fiberid->pff"fiber %d is now running"id|`Name(id,name)->pff"%d is named %S"idname|`Logmsg->pff"log: %S"msg|`Enter_spanop->pff"enter span %S"op|`Exit_span->pff"exit span"|`Getid->pff"get from %d"id|`Try_getid->pff"waiting to get from %d"id|`Putid->pff"put %d"id|`Error(id,msg)->pff"%d fails: %S"idmsg|`Exit_cc->pff"CC finishes"|`Exit_fiberid->pff"fiber %d finishes"id|`Suspend_domainBegin->pff"domain suspend"|`Suspend_domainEnd->pff"domain resume"|`Suspend_fiberop->pff"fiber suspended: %s"op|`Domain_spawnparent->pff"domain spawned by fiber %d"parenttype'ahandler=int->Runtime_events.Timestamp.t->'a->unitletadd_callbacks(fn:eventhandler)x=letcreate_eventring_idtsev(id,ty)=matchRuntime_events.User.tagevwith|Create_obj->fnring_idts(`Create(id,`Objty))|_->()inletcreate_cc_eventring_idtsev(id,ty)=matchRuntime_events.User.tagevwith|Create_cc->fnring_idts(`Create(id,`Ccty))|_->()inletint_eventring_idtsevv=matchRuntime_events.User.tagevwith|Get->fnring_idts(`Getv)|Try_get->fnring_idts(`Try_getv)|Put->fnring_idts(`Putv)|Fiber->fnring_idts(`Fiberv)|Exit_fiber->fnring_idts(`Exit_fiberv)|Domain_spawn->fnring_idts(`Domain_spawnv)|_->()inletspan_eventring_idtsevv=matchRuntime_events.User.tagevwith|Suspend_domain->fnring_idts(`Suspend_domainv)|_->()inletid_id_eventring_idtsev(id1,id2)=matchRuntime_events.User.tagevwith|Create_fiber->fnring_idts(`Create(id1,`Fiber_inid2))|_->()inletint_exn_eventring_idtsev(id,ex)=matchRuntime_events.User.tagev,exwith|Error,Failuremsg->fnring_idts(`Error(id,msg))|_->()inletid_string_eventring_idtsevv=matchRuntime_events.User.tagevwith|Name->fnring_idts(`Namev)|_->()inletstring_eventring_idtsevv=matchRuntime_events.User.tagevwith|Log->fnring_idts(`Logv)|Enter_span->fnring_idts(`Enter_spanv)|Suspend_fiber->fnring_idts(`Suspend_fiberv)|_->()inletunit_eventring_idtsev()=matchRuntime_events.User.tagevwith|Exit_cc->fnring_idts`Exit_cc|Exit_span->fnring_idts`Exit_span|_->()inx|>Runtime_events.Callbacks.add_user_eventid_obj_typecreate_event|>Runtime_events.Callbacks.add_user_eventid_id_typeid_id_event|>Runtime_events.Callbacks.add_user_eventid_cc_typecreate_cc_event|>Runtime_events.Callbacks.add_user_eventRuntime_events.Type.intint_event|>Runtime_events.Callbacks.add_user_eventexn_typeint_exn_event|>Runtime_events.Callbacks.add_user_eventstringstring_event|>Runtime_events.Callbacks.add_user_eventid_string_typeid_string_event|>Runtime_events.Callbacks.add_user_eventRuntime_events.Type.spanspan_event|>Runtime_events.Callbacks.add_user_eventRuntime_events.Type.unitunit_event