1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module PidSet = Set.Make (struct
type t = Process.t
let compare (a : t) (b : t) = Pid.compare (Process.pid a) (Process.pid b)
end)
type t = { _set : PidSet.t Atomic.t } [@@unboxed]
let create () = { _set = Atomic.make PidSet.empty }
let rec remove t proc =
let old_set = Atomic.get t._set in
let new_set = PidSet.remove proc old_set in
if Atomic.compare_and_set t._set old_set new_set then () else remove t proc
let contains t proc = PidSet.mem proc (Atomic.get t._set)
let size t = PidSet.cardinal (Atomic.get t._set)
let rec add t proc =
let old_set = Atomic.get t._set in
let new_set = PidSet.add proc old_set in
if Atomic.compare_and_set t._set old_set new_set then () else add t proc