src/Pure/Concurrent/single_assignment.ML
changeset 37216 3165bc303f66
parent 35014 a725ff6ead26
child 37906 4195727a1f6c
equal deleted inserted replaced
37215:91dfe7dccfdf 37216:3165bc303f66
    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)) ()));