src/Pure/Concurrent/thread_data.ML
changeset 62889 99c7f31615c2
child 62890 728aa05e9433
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Pure/Concurrent/thread_data.ML	Wed Apr 06 16:33:33 2016 +0200
@@ -0,0 +1,42 @@
+(*  Title:      Pure/Concurrent/thread_data.ML
+    Author:     Makarius
+
+Thread-local data -- raw version without context management.
+*)
+
+signature THREAD_DATA =
+sig
+  type 'a var
+  val var: unit -> 'a var
+  val get: 'a var -> 'a option
+  val put: 'a var -> 'a option -> unit
+  val setmp: 'a var -> 'a option -> ('b -> 'c) -> 'b -> 'c
+end;
+
+structure Thread_Data: THREAD_DATA =
+struct
+
+abstype 'a var = Var of 'a option Universal.tag
+with
+
+fun var () : 'a var = Var (Universal.tag ());
+
+fun get (Var tag) =
+  (case Thread.getLocal tag of
+    SOME data => data
+  | NONE => NONE);
+
+fun put (Var tag) data = Thread.setLocal (tag, data);
+
+fun setmp v data f x =
+  uninterruptible (fn restore_attributes => fn () =>
+    let
+      val orig_data = get v;
+      val _ = put v data;
+      val result = Exn.capture (restore_attributes f) x;
+      val _ = put v orig_data;
+    in Exn.release result end) ();
+
+end;
+
+end;