package kcas_data

  1. Overview
  2. Docs

Source file stack.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
open Kcas

type 'a t = 'a Elems.t Loc.t

let create () = Loc.make Elems.empty
let copy s = Loc.make @@ Loc.get s
let of_seq xs = Loc.make (Elems.of_seq_rev xs)

module Xt = struct
  let length ~xt s = Xt.get ~xt s |> Elems.length
  let is_empty ~xt s = Xt.get ~xt s == Elems.empty
  let push ~xt x s = Xt.unsafe_modify ~xt s @@ Elems.cons x
  let pop_opt ~xt s = Xt.unsafe_update ~xt s Elems.tl_safe |> Elems.hd_opt
  let pop_all ~xt s = Elems.to_seq @@ Xt.exchange ~xt s Elems.empty

  let pop_blocking ~xt s =
    Xt.unsafe_update ~xt s Elems.tl_safe |> Elems.hd_or_retry

  let top_opt ~xt s = Xt.get ~xt s |> Elems.hd_opt
  let top_blocking ~xt s = Xt.get ~xt s |> Elems.hd_or_retry
  let clear ~xt s = Xt.set ~xt s Elems.empty
  let swap ~xt s1 s2 = Xt.swap ~xt s1 s2
  let to_seq ~xt s = Elems.to_seq @@ Xt.get ~xt s
end

let length s = Loc.get s |> Elems.length
let is_empty s = Loc.get s == Elems.empty

let push x s =
  (* Fenceless is safe as we always update. *)
  Loc.fenceless_modify s @@ Elems.cons x

let pop_opt s = Loc.update s Elems.tl_safe |> Elems.hd_opt
let pop_all s = Loc.exchange s Elems.empty |> Elems.to_seq

let pop_blocking s =
  (* Fenceless is safe as we always update. *)
  Loc.fenceless_update s Elems.tl_or_retry |> Elems.hd_unsafe

let top_opt s = Loc.get s |> Elems.hd_opt
let top_blocking s = Loc.get_as Elems.hd_or_retry s
let clear s = Loc.set s Elems.empty
let swap s1 s2 = Kcas.Xt.commit { tx = Kcas.Xt.swap s1 s2 }
let to_seq s = Elems.to_seq @@ Loc.get s
let iter f s = Elems.iter f @@ Loc.get s
let fold f a s = Elems.fold f a @@ Loc.get s

exception Empty

let of_option = function None -> raise Empty | Some value -> value [@@inline]
let top s = top_opt s |> of_option
let pop s = pop_opt s |> of_option
OCaml

Innovation. Community. Security.