src/Pure/Concurrent/counter.ML
author wenzelm
Mon, 01 Apr 2024 15:37:55 +0200
changeset 80064 0d94dd2fd2d0
parent 68804 cbde6e3b132b
permissions -rw-r--r--
clarified names (see also 9c00a46d69d0, c5cd7a58cf2d); NB: Simplifier.set_trace_ops overrides Pure setup for Simplifier_Trace panel, but that is hardly every used in practice;

(*  Title:      Pure/Concurrent/counter.ML
    Author:     Makarius

Synchronized counter for unique identifiers > 0.

NB: ML ticks forwards, JVM ticks backwards.
*)

signature COUNTER =
sig
  val make: unit -> unit -> int
end;

structure Counter: COUNTER =
struct

fun make () =
  let
    val counter = Synchronized.var "counter" 0;
    fun next () =
      Synchronized.change_result counter
        (fn i =>
          let
            val k = i + 1;
            val n = if Thread_Data.is_virtual then 2 * k + 1 else 2 * k;
          in (n, k) end);
  in next end;

end;