mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-09 12:23:32 -04:00
39 lines
869 B
OCaml
39 lines
869 B
OCaml
module Dom = Opentelemetry_domain
|
|
module Atomic = Opentelemetry_atomic.Atomic
|
|
|
|
type 'a t = 'a list Atomic.t
|
|
|
|
let make () = Atomic.make []
|
|
|
|
let[@inline] is_empty self : bool =
|
|
match Atomic.get self with
|
|
| [] -> true
|
|
| _ :: _ -> false
|
|
|
|
let get = Atomic.get
|
|
|
|
let add self x =
|
|
let backoff = ref 1 in
|
|
while
|
|
let old = Atomic.get self in
|
|
let l' = x :: old in
|
|
not (Atomic.compare_and_set self old l')
|
|
do
|
|
(* backoff *)
|
|
Dom.relax_loop !backoff;
|
|
backoff := min 128 (2 * !backoff)
|
|
done
|
|
|
|
let pop_all (type res) self : res list =
|
|
let exception Return of res list in
|
|
let backoff = ref 1 in
|
|
try
|
|
while true do
|
|
let l = Atomic.get self in
|
|
if Atomic.compare_and_set self l [] then raise_notrace (Return l);
|
|
|
|
(* backoff *)
|
|
Dom.relax_loop !backoff;
|
|
backoff := min 128 (2 * !backoff)
|
|
done
|
|
with Return r -> r
|