123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237open!BaseopenBasementmoduleCompare_failed_or_set_here=structtypet=Basement.Compare_failed_or_set_here.t=|Compare_failed|Set_here[@@derivingsexp_of~stackify]endtype('a:value_or_null)t='aBasement.Portable_atomic.tletmake=Basement.Portable_atomic.makeexternalget:('a:value_or_null).('at[@local_opt])->'a@contendedportable@@portable="%atomic_load"externalexchange:('a:value_or_null).('at[@local_opt])->'a@contendedportable->'a@contendedportable@@portable="%atomic_exchange"externalset:('a:value_or_null).('at[@local_opt])->'a@contendedportable->unit@@portable="%atomic_set"externalcompare_and_set:('a:value_or_null).('at[@local_opt])->if_phys_equal_to:'a@contended->replace_with:'a@contendedportable->Compare_failed_or_set_here.t@@portable="%atomic_cas"externalcompare_exchange:('a:value_or_null).('at[@local_opt])->if_phys_equal_to:'a@contended->replace_with:'a@contendedportable->'a@contendedportable@@portable="%atomic_compare_exchange"let[@inline]get_and_updatet~pure_f=let[@inline]recauxbackoff=letold=gettinletnew_=pure_foldinmatchcompare_and_sett~if_phys_equal_to:old~replace_with:new_with|Set_here->old|Compare_failed->aux(Backoff.oncebackoff)inauxBackoff.default[@nontail];;let[@inline]update(typea:value_or_null)(t:at)~pure_f=Basement.Stdlib_shim.ignore_contended(get_and_updatet~pure_f:a);;externalfetch_and_add:(intt[@local_opt])->int->int@@portable="%atomic_fetch_add"externaladd:(intt[@local_opt])->int->unit@@portable="%atomic_add"externalsub:(intt[@local_opt])->int->unit@@portable="%atomic_sub"externallogand:(intt[@local_opt])->int->unit@@portable="%atomic_land"externallogor:(intt[@local_opt])->int->unit@@portable="%atomic_lor"externallogxor:(intt[@local_opt])->int->unit@@portable="%atomic_lxor"letincrr=addr1letdecrr=subr1letsexp_of_tsexp_of_at=sexp_of_a(gett)lett_of_sexpa_of_sexpsexp=make(a_of_sexpsexp)moduleList=structtypenonrec('a:value_or_null)t='alisttletpushtx=updatet~pure_f:(funxs->x::xs)letpopt=matchget_and_updatet~pure_f:(function|[]->[]|_::xs->xs)with|[]->Null|x::_->Thisx;;letpop_optt=matchget_and_updatet~pure_f:(function|[]->[]|_::xs->xs)with|[]->None|x::_->Somex;;letpop_exnt=matchget_and_updatet~pure_f:(function|[]->[]|_::xs->xs)with|[]->failwith"[Atomic.List.pop_exn]: Empty list"|x::_->x;;endmoduleLoc=structtype('a:value_or_nullmodcontendedportable)t='aStdlib.Atomic.Loc.texternalget:('a:value_or_nullmodcontendedportable).('at[@local_opt])@contended->'a@contended@@portable="%atomic_load_loc"externalset:('a:value_or_nullmodcontendedportable).('at[@local_opt])@contended->'a@contended->unit@@portable="%atomic_set_loc"externalexchange:('a:value_or_nullmodcontendedportable).('at[@local_opt])@contended->'a@contended->'a@contended@@portable="%atomic_exchange_loc"externalcompare_and_set:('a:value_or_nullmodcontendedportable).('at[@local_opt])@contended->if_phys_equal_to:'a@contended->replace_with:'a@contended->Compare_failed_or_set_here.t@@portable="%atomic_cas_loc"externalcompare_exchange:('a:value_or_nullmodcontendedportable).('at[@local_opt])@contended->if_phys_equal_to:'a@contended->replace_with:'a@contended->'a@contended@@portable="%atomic_compare_exchange_loc"letget_and_updatet~pure_f=letrecauxbackoff=letold=gettinletnew_=pure_foldinmatchcompare_and_sett~if_phys_equal_to:old~replace_with:new_with|Set_here->old|Compare_failed->aux(Backoff.oncebackoff)[@@inline]inauxBackoff.default[@nontail][@@inline];;letupdatet~pure_f=Basement.Stdlib_shim.ignore_contended(get_and_updatet~pure_f)[@@inline];;externalfetch_and_add:(intt[@local_opt])@contended->int->int@@portable="%atomic_fetch_add_loc"externaladd:(intt[@local_opt])@contended->int->unit@@portable="%atomic_add_loc"externalsub:(intt[@local_opt])@contended->int->unit@@portable="%atomic_sub_loc"externallogand:(intt[@local_opt])@contended->int->unit@@portable="%atomic_land_loc"externallogor:(intt[@local_opt])@contended->int->unit@@portable="%atomic_lor_loc"externallogxor:(intt[@local_opt])@contended->int->unit@@portable="%atomic_lxor_loc"letincrr=addr1letdecrr=subr1letsexp_of_tsexp_of_at=sexp_of_a(gett)endletcontents(t:_t)=[%atomic.loct.contended.Stdlib.Atomic.contents]moduleExpert=struct(* This is subject to CSE. *)externalfenceless_get_cse:('a:value_or_null).('at[@local_opt])->'a@contendedportable@@portable="%field0"let[@inline]fenceless_gett=(* We use [Sys.opaque_identity] to prevent CSE. *)fenceless_get_cse(Sys.opaque_identityt);;end