| author | wenzelm | 
| Wed, 20 Nov 2019 16:56:03 +0100 | |
| changeset 71144 | d6b9dead8c8d | 
| 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: 
62920diff
changeset | 23 | let | 
| 
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
 wenzelm parents: 
62920diff
changeset | 24 | val k = i + 1; | 
| 
cbde6e3b132b
actually ensure globally unique counter results (amending a5853334c179);
 wenzelm parents: 
62920diff
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: 
62920diff
changeset | 26 | in (n, k) end); | 
| 52537 | 27 | in next end; | 
| 28 | ||
| 29 | end; |