# HG changeset patch # User wenzelm # Date 1265490302 -3600 # Node ID efafb3337ef3378da9c134530e5008b8c905e49d # Parent a725ff6ead264a8a5d15c5f35eccc10b3f37551e removed slightly adhoc single-assignment feature, cf. structure Single_Assignment; access: uninterruptible update/broadcast, to prevent lost signals; diff -r a725ff6ead26 -r efafb3337ef3 src/Pure/Concurrent/synchronized.ML --- a/src/Pure/Concurrent/synchronized.ML Sat Feb 06 22:01:48 2010 +0100 +++ b/src/Pure/Concurrent/synchronized.ML Sat Feb 06 22:05:02 2010 +0100 @@ -11,10 +11,8 @@ val value: 'a var -> 'a val timed_access: 'a var -> ('a -> Time.time option) -> ('a -> ('b * 'a) option) -> 'b option val guarded_access: 'a var -> ('a -> ('b * 'a) option) -> 'b - val readonly_access: 'a var -> ('a -> 'b option) -> 'b val change_result: 'a var -> ('a -> 'b * 'a) -> 'b val change: 'a var -> ('a -> 'a) -> unit - val assign: 'a var -> ('a -> 'a) -> unit end; structure Synchronized: SYNCHRONIZED = @@ -22,11 +20,12 @@ (* state variables *) -datatype 'a var = Var of +abstype 'a var = Var of {name: string, lock: Mutex.mutex, cond: ConditionVar.conditionVar, - var: 'a Unsynchronized.ref}; + var: 'a Unsynchronized.ref} +with fun var name x = Var {name = name, @@ -39,7 +38,7 @@ (* synchronized access *) -fun access {time_limit, readonly, finish} (Var {name, lock, cond, var}) f = +fun timed_access (Var {name, lock, cond, var}) time_limit f = SimpleThread.synchronized name lock (fn () => let fun try_change () = @@ -51,36 +50,19 @@ | Exn.Result false => NONE | Exn.Exn exn => reraise exn) | SOME (y, x') => - if readonly then SOME y - else - let - val _ = magic_immutability_test var - andalso raise Fail ("Attempt to change finished variable " ^ quote name); - val _ = var := x'; - val _ = if finish then magic_immutability_mark var else (); - in SOME y end) + uninterruptible (fn _ => fn () => + (var := x'; ConditionVar.broadcast cond; SOME y)) ()) end; - val res = try_change (); - val _ = ConditionVar.broadcast cond; - in res end); - -fun timed_access var time_limit f = - access {time_limit = time_limit, readonly = false, finish = false} var f; + in try_change () end); fun guarded_access var f = the (timed_access var (K NONE) f); -fun readonly_access var f = - the (access {time_limit = K NONE, readonly = true, finish = false} var - (fn x => (case f x of NONE => NONE | SOME y => SOME (y, x)))); - (* unconditional change *) fun change_result var f = guarded_access var (SOME o f); fun change var f = change_result var (fn x => ((), f x)); -fun assign var f = - the (access {time_limit = K NONE, readonly = false, finish = true} var - (fn x => SOME ((), f x))); +end; end; diff -r a725ff6ead26 -r efafb3337ef3 src/Pure/Concurrent/synchronized_sequential.ML --- a/src/Pure/Concurrent/synchronized_sequential.ML Sat Feb 06 22:01:48 2010 +0100 +++ b/src/Pure/Concurrent/synchronized_sequential.ML Sat Feb 06 22:05:02 2010 +0100 @@ -20,13 +20,8 @@ fun guarded_access var f = the (timed_access var (K NONE) f); -fun readonly_access var f = - guarded_access var (fn x => (case f x of NONE => NONE | SOME y => SOME (y, x))); - fun change_result var f = guarded_access var (SOME o f); fun change var f = change_result var (fn x => ((), f x)); -val assign = change; - end; end;