equal
deleted
inserted
replaced
30 var = SingleAssignment.saref ()}; |
30 var = SingleAssignment.saref ()}; |
31 |
31 |
32 fun peek (Var {var, ...}) = SingleAssignment.savalue var; |
32 fun peek (Var {var, ...}) = SingleAssignment.savalue var; |
33 |
33 |
34 fun await (v as Var {name, lock, cond, var}) = |
34 fun await (v as Var {name, lock, cond, var}) = |
35 SimpleThread.synchronized name lock (fn () => |
35 Simple_Thread.synchronized name lock (fn () => |
36 let |
36 let |
37 fun wait () = |
37 fun wait () = |
38 (case peek v of |
38 (case peek v of |
39 NONE => |
39 NONE => |
40 (case Multithreading.sync_wait NONE NONE cond lock of |
40 (case Multithreading.sync_wait NONE NONE cond lock of |
42 | Exn.Exn exn => reraise exn) |
42 | Exn.Exn exn => reraise exn) |
43 | SOME x => x); |
43 | SOME x => x); |
44 in wait () end); |
44 in wait () end); |
45 |
45 |
46 fun assign (v as Var {name, lock, cond, var}) x = |
46 fun assign (v as Var {name, lock, cond, var}) x = |
47 SimpleThread.synchronized name lock (fn () => |
47 Simple_Thread.synchronized name lock (fn () => |
48 (case peek v of |
48 (case peek v of |
49 SOME _ => raise Fail ("Duplicate assignment to variable " ^ quote name) |
49 SOME _ => raise Fail ("Duplicate assignment to variable " ^ quote name) |
50 | NONE => |
50 | NONE => |
51 uninterruptible (fn _ => fn () => |
51 uninterruptible (fn _ => fn () => |
52 (SingleAssignment.saset (var, x); ConditionVar.broadcast cond)) ())); |
52 (SingleAssignment.saset (var, x); ConditionVar.broadcast cond)) ())); |