package grenier

  1. Overview
  2. Docs
A collection of various algorithms in OCaml

Install

Dune Dependency

Authors

Maintainers

Sources

grenier-0.15.tbz
sha256=dec7f84b9e93d5825f10c7dea84d5a74d7365ede45664ae63c26b5e8045c1c44
sha512=b8aa1569c2e24b89674d1b34de34cd1798896bb6a53aa5a1287f68cee880125e6b687f66ad73da9069a01cc3ece1f0684f48328b099d43529bff736b772c8fd8

doc/src/grenier.orderme/order_managed_indir.ml.html

Source file order_managed_indir.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
open Order_indir
type order = t

type t = {
  t : order;
  (* This strange dance with protect is to prevent the GC from collecting
     values in the middle of an operation. *)
  lock : gc_lock;
}

and gc_lock = {
  mutable locks: int;
  mutable forgotten: order list;
}

let lock lock =
  lock.locks <- lock.locks + 1

let unlock lock =
  lock.locks <- lock.locks - 1;
  if lock.locks = 0 then
    match lock.forgotten with
    | [] -> ()
    | forgotten ->
      lock.forgotten <- [];
      List.iter forget forgotten

let forget {lock; t} =
  if lock.locks > 0 then
    lock.forgotten <- t :: lock.forgotten
  else
    forget t

let is_valid t =
  lock t.lock;
  let result = is_valid t.t in
  unlock t.lock;
  result

let root () =
  let t = {t = root (); lock = { locks = 0; forgotten = [] }} in
  Gc.finalise forget t;
  t

let after t =
  lock t.lock;
  let t' = {t = after t.t; lock = t.lock} in
  Gc.finalise forget t';
  unlock t.lock;
  t'

let before t =
  lock t.lock;
  let t' = {t = before t.t; lock = t.lock} in
  Gc.finalise forget t';
  unlock t.lock;
  t'

let same_order t1 t2 =
  same_order t1.t t2.t

let compare t1 t2 =
  compare t1.t t2.t

let cardinal t =
  cardinal t.t

let unsafe_check t msg =
  lock t.lock;
  unsafe_check t.t ("(Order_managed) " ^ msg);
  unlock t.lock
OCaml

Innovation. Community. Security.