# HG changeset patch # User wenzelm # Date 1248785693 -7200 # Node ID e586c82fdf69802e66effd92777c00cdb79cde61 # Parent 3c28e4e578ad8a28223deac18b8a3728af262f67 group status: Synchronized.var; diff -r 3c28e4e578ad -r e586c82fdf69 src/Pure/Concurrent/task_queue.ML --- a/src/Pure/Concurrent/task_queue.ML Tue Jul 28 14:43:46 2009 +0200 +++ b/src/Pure/Concurrent/task_queue.ML Tue Jul 28 14:54:53 2009 +0200 @@ -52,11 +52,11 @@ datatype group = Group of {parent: group option, id: serial, - status: exn list ref}; + status: exn list Synchronized.var}; fun make_group (parent, id, status) = Group {parent = parent, id = id, status = status}; -fun new_group parent = make_group (parent, serial (), ref []); +fun new_group parent = make_group (parent, serial (), Synchronized.var "group" []); fun group_id (Group {id, ...}) = id; fun eq_group (group1, group2) = group_id group1 = group_id group2; @@ -67,16 +67,20 @@ (* group status *) -fun cancel_group (Group {status, ...}) exn = CRITICAL (fn () => - (case exn of - Exn.Interrupt => if null (! status) then status := [exn] else () - | _ => change status (cons exn))); +fun cancel_group (Group {status, ...}) exn = + Synchronized.change status + (fn exns => + (case exn of + Exn.Interrupt => if null exns then [exn] else exns + | _ => exn :: exns)); -fun is_canceled (Group {parent, status, ...}) = (*non-critical*) - not (null (! status)) orelse (case parent of NONE => false | SOME group => is_canceled group); +fun is_canceled (Group {parent, status, ...}) = + not (null (Synchronized.value status)) orelse + (case parent of NONE => false | SOME group => is_canceled group); -fun group_status (Group {parent, status, ...}) = (*non-critical*) - ! status @ (case parent of NONE => [] | SOME group => group_status group); +fun group_status (Group {parent, status, ...}) = + Synchronized.value status @ + (case parent of NONE => [] | SOME group => group_status group); fun str_of_group group = (is_canceled group ? enclose "(" ")") (string_of_int (group_id group));