| author | kleing | 
| Thu, 03 Nov 2011 18:10:13 +1100 | |
| changeset 45323 | df7554ebe024 | 
| parent 39616 | 8052101883c3 | 
| permissions | -rw-r--r-- | 
| 32737 | 1 | (* Title: Pure/ML-Systems/unsynchronized.ML | 
| 2 | Author: Makarius | |
| 3 | ||
| 4 | Raw ML references as unsynchronized state variables. | |
| 5 | *) | |
| 6 | ||
| 7 | structure Unsynchronized = | |
| 8 | struct | |
| 9 | ||
| 10 | datatype ref = datatype ref; | |
| 11 | ||
| 12 | val op := = op :=; | |
| 13 | val ! = !; | |
| 14 | ||
| 15 | fun change r f = r := f (! r); | |
| 16 | fun change_result r f = let val (x, y) = f (! r) in r := y; x end; | |
| 17 | ||
| 18 | fun inc i = (i := ! i + (1: int); ! i); | |
| 19 | fun dec i = (i := ! i - (1: int); ! i); | |
| 20 | ||
| 39616 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 21 | fun setmp flag value f x = | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 22 | uninterruptible (fn restore_attributes => fn () => | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 23 | let | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 24 | val orig_value = ! flag; | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 25 | val _ = flag := value; | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 26 | val result = Exn.capture (restore_attributes f) x; | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 27 | val _ = flag := orig_value; | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 28 | in Exn.release result end) (); | 
| 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
38799diff
changeset | 29 | |
| 32737 | 30 | end; |