src/Pure/Concurrent/thread_data.ML
changeset 62889 99c7f31615c2
child 62890 728aa05e9433
equal deleted inserted replaced
62888:64f44d7279e5 62889:99c7f31615c2
       
     1 (*  Title:      Pure/Concurrent/thread_data.ML
       
     2     Author:     Makarius
       
     3 
       
     4 Thread-local data -- raw version without context management.
       
     5 *)
       
     6 
       
     7 signature THREAD_DATA =
       
     8 sig
       
     9   type 'a var
       
    10   val var: unit -> 'a var
       
    11   val get: 'a var -> 'a option
       
    12   val put: 'a var -> 'a option -> unit
       
    13   val setmp: 'a var -> 'a option -> ('b -> 'c) -> 'b -> 'c
       
    14 end;
       
    15 
       
    16 structure Thread_Data: THREAD_DATA =
       
    17 struct
       
    18 
       
    19 abstype 'a var = Var of 'a option Universal.tag
       
    20 with
       
    21 
       
    22 fun var () : 'a var = Var (Universal.tag ());
       
    23 
       
    24 fun get (Var tag) =
       
    25   (case Thread.getLocal tag of
       
    26     SOME data => data
       
    27   | NONE => NONE);
       
    28 
       
    29 fun put (Var tag) data = Thread.setLocal (tag, data);
       
    30 
       
    31 fun setmp v data f x =
       
    32   uninterruptible (fn restore_attributes => fn () =>
       
    33     let
       
    34       val orig_data = get v;
       
    35       val _ = put v data;
       
    36       val result = Exn.capture (restore_attributes f) x;
       
    37       val _ = put v orig_data;
       
    38     in Exn.release result end) ();
       
    39 
       
    40 end;
       
    41 
       
    42 end;