src/Pure/Concurrent/par_exn.ML
changeset 50911 ee7fe4230642
parent 50909 b2fb1ab1475d
child 51428 12e46440e391
--- a/src/Pure/Concurrent/par_exn.ML	Wed Jan 16 11:31:08 2013 +0100
+++ b/src/Pure/Concurrent/par_exn.ML	Wed Jan 16 16:26:36 2013 +0100
@@ -7,8 +7,8 @@
 
 signature PAR_EXN =
 sig
-  val serial: exn -> serial * exn
-  val set_serial: exn -> exn
+  val identify: Properties.entry list -> exn -> exn
+  val the_serial: exn -> int
   val make: exn list -> exn
   val dest: exn -> exn list option
   val is_interrupted: 'a Exn.result list -> bool
@@ -21,18 +21,17 @@
 
 (* identification via serial numbers *)
 
-fun serial exn =
-  (case get_exn_serial exn of
-    SOME i => (i, exn)
-  | NONE =>
-      let
-        val i = Library.serial ();
-        val exn' = uninterruptible (fn _ => set_exn_serial i) exn;
-      in (i, exn') end);
+fun identify default_props exn =
+  let
+    val props = Exn_Properties.get exn;
+    val update_serial =
+      if Properties.defined props Markup.serialN then []
+      else [(Markup.serialN, serial_string ())];
+    val update_props = filter_out (Properties.defined props o #1) default_props;
+  in Exn_Properties.update (update_serial @ update_props) exn end;
 
-fun set_serial exn = #2 (serial exn);
-
-val the_serial = the o get_exn_serial;
+fun the_serial exn =
+  Markup.parse_int (the (Properties.get (Exn_Properties.get exn) Markup.serialN));
 
 val exn_ord = rev_order o int_ord o pairself the_serial;
 
@@ -44,7 +43,7 @@
     no occurrences of Par_Exn or Exn.Interrupt*)
 
 fun par_exns (Par_Exn exns) = exns
-  | par_exns exn = if Exn.is_interrupt exn then [] else [set_serial exn];
+  | par_exns exn = if Exn.is_interrupt exn then [] else [identify [] exn];
 
 fun make exns =
   (case Ord_List.unions exn_ord (map par_exns exns) of