| author | haftmann | 
| Sun, 06 Apr 2025 14:21:18 +0200 | |
| changeset 82452 | 8b575e1fef3b | 
| 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;  |