author | wenzelm |
Sat, 22 Oct 2022 16:56:17 +0200 | |
changeset 76361 | 3b9f36ef7365 |
parent 68804 | cbde6e3b132b |
permissions | -rw-r--r-- |
52537 | 1 |
(* Title: Pure/Concurrent/counter.ML |
2 |
Author: Makarius |
|
3 |
||
4 |
Synchronized counter for unique identifiers > 0. |
|
5 |
||
6 |
NB: ML ticks forwards, JVM ticks backwards. |
|
7 |
*) |
|
8 |
||
9 |
signature COUNTER = |
|
10 |
sig |
|
11 |
val make: unit -> unit -> int |
|
12 |
end; |
|
13 |
||
14 |
structure Counter: COUNTER = |
|
15 |
struct |
|
16 |
||
17 |
fun make () = |
|
18 |
let |
|
62920 | 19 |
val counter = Synchronized.var "counter" 0; |
52537 | 20 |
fun next () = |
21 |
Synchronized.change_result counter |
|
22 |
(fn i => |
|
68804
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
wenzelm
parents:
62920
diff
changeset
|
23 |
let |
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
wenzelm
parents:
62920
diff
changeset
|
24 |
val k = i + 1; |
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
wenzelm
parents:
62920
diff
changeset
|
25 |
val n = if Thread_Data.is_virtual then 2 * k + 1 else 2 * k; |
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
wenzelm
parents:
62920
diff
changeset
|
26 |
in (n, k) end); |
52537 | 27 |
in next end; |
28 |
||
29 |
end; |