src/Pure/Concurrent/par_exn.ML
changeset 50911 ee7fe4230642
parent 50909 b2fb1ab1475d
child 51428 12e46440e391
equal deleted inserted replaced
50910:54f06ba192ef 50911:ee7fe4230642
     5 evaluations.  Interrupt counts as neutral element.
     5 evaluations.  Interrupt counts as neutral element.
     6 *)
     6 *)
     7 
     7 
     8 signature PAR_EXN =
     8 signature PAR_EXN =
     9 sig
     9 sig
    10   val serial: exn -> serial * exn
    10   val identify: Properties.entry list -> exn -> exn
    11   val set_serial: exn -> exn
    11   val the_serial: exn -> int
    12   val make: exn list -> exn
    12   val make: exn list -> exn
    13   val dest: exn -> exn list option
    13   val dest: exn -> exn list option
    14   val is_interrupted: 'a Exn.result list -> bool
    14   val is_interrupted: 'a Exn.result list -> bool
    15   val release_all: 'a Exn.result list -> 'a list
    15   val release_all: 'a Exn.result list -> 'a list
    16   val release_first: 'a Exn.result list -> 'a list
    16   val release_first: 'a Exn.result list -> 'a list
    19 structure Par_Exn: PAR_EXN =
    19 structure Par_Exn: PAR_EXN =
    20 struct
    20 struct
    21 
    21 
    22 (* identification via serial numbers *)
    22 (* identification via serial numbers *)
    23 
    23 
    24 fun serial exn =
    24 fun identify default_props exn =
    25   (case get_exn_serial exn of
    25   let
    26     SOME i => (i, exn)
    26     val props = Exn_Properties.get exn;
    27   | NONE =>
    27     val update_serial =
    28       let
    28       if Properties.defined props Markup.serialN then []
    29         val i = Library.serial ();
    29       else [(Markup.serialN, serial_string ())];
    30         val exn' = uninterruptible (fn _ => set_exn_serial i) exn;
    30     val update_props = filter_out (Properties.defined props o #1) default_props;
    31       in (i, exn') end);
    31   in Exn_Properties.update (update_serial @ update_props) exn end;
    32 
    32 
    33 fun set_serial exn = #2 (serial exn);
    33 fun the_serial exn =
    34 
    34   Markup.parse_int (the (Properties.get (Exn_Properties.get exn) Markup.serialN));
    35 val the_serial = the o get_exn_serial;
       
    36 
    35 
    37 val exn_ord = rev_order o int_ord o pairself the_serial;
    36 val exn_ord = rev_order o int_ord o pairself the_serial;
    38 
    37 
    39 
    38 
    40 (* parallel exceptions *)
    39 (* parallel exceptions *)
    42 exception Par_Exn of exn list;
    41 exception Par_Exn of exn list;
    43   (*non-empty list with unique identified elements sorted by exn_ord;
    42   (*non-empty list with unique identified elements sorted by exn_ord;
    44     no occurrences of Par_Exn or Exn.Interrupt*)
    43     no occurrences of Par_Exn or Exn.Interrupt*)
    45 
    44 
    46 fun par_exns (Par_Exn exns) = exns
    45 fun par_exns (Par_Exn exns) = exns
    47   | par_exns exn = if Exn.is_interrupt exn then [] else [set_serial exn];
    46   | par_exns exn = if Exn.is_interrupt exn then [] else [identify [] exn];
    48 
    47 
    49 fun make exns =
    48 fun make exns =
    50   (case Ord_List.unions exn_ord (map par_exns exns) of
    49   (case Ord_List.unions exn_ord (map par_exns exns) of
    51     [] => Exn.Interrupt
    50     [] => Exn.Interrupt
    52   | es => Par_Exn es);
    51   | es => Par_Exn es);