123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108(* This is a wrapper for memprof-limits libs *)moduletypeIntf=sigmoduleToken:sigtypetvalcreate:unit->tvalset:t->unitvalis_set:t->boolendvalstart:unit->unitvallimit:token:Token.t->f:('a->'b)->'a->('b,exn)Result.tvalname:unit->stringvalavailable:boolendmoduleCoq:Intf=structmoduleToken:sigtypetvalcreate:unit->tvalset:t->unitvalis_set:t->boolend=structtypet=boolrefletcreate()=reffalseletsett=t:=true;Control.interrupt:=trueletis_sett=!tendletstart()=()letlimit~token~fx=ifToken.is_settokenthenErrorSys.Breakelselet()=Control.interrupt:=falseintryOk(fx)withSys.Break->ErrorSys.Breakletname()="Control.interrupt"letavailable=trueendmoduleMp=Limits_mp_impltypebackend=|Coq|Mpletbackend:(moduleIntf)ref=ref(moduleCoq:Intf)letselect=function|Coq->backend:=(moduleCoq)|Mp->backend:=(moduleMp)(* Set this to false for 8.19 and lower *)letselect_best=function|None->ifMp.available&&Version.safe_for_memprofthenselectMpelseselectCoq|Somebackend->selectbackendmoduleToken=structtypet=|CofCoq.Token.t|MofMp.Token.t|A(* Atomic operation *)letcreate()=letmoduleM=(val!backend)inmatchM.name()with|"memprof-limits"->M(Mp.Token.create())|"Control.interrupt"|_->C(Coq.Token.create())letset=function|Ctoken->Coq.Token.settoken|Mtoken->Mp.Token.settoken|A->()letis_set=function|Ctoken->Coq.Token.is_settoken|Mtoken->Mp.Token.is_settoken|A->falseendletcreate_atomic()=Token.Aletstart()=letmoduleM=(val!backend)inM.start()letlimit~token~fx=letmoduleM=(val!backend)inmatchtokenwith|Token.Ctoken->Coq.limit~token~fx|Token.Mtoken->Mp.limit~token~fx|Token.A->let()=Control.interrupt:=falseinOk(fx)letname()=letmoduleM=(val!backend)inM.name()letavailable=true