src/Pure/Concurrent/event_timer.ML
changeset 52798 9d3c9862d1dd
parent 52589 d28d2d89034d
child 56768 06388a5cfb7c
equal deleted inserted replaced
52797:0d6f2a87d1a5 52798:9d3c9862d1dd
    12   type event = unit -> unit
    12   type event = unit -> unit
    13   eqtype request
    13   eqtype request
    14   val request: Time.time -> event -> request
    14   val request: Time.time -> event -> request
    15   val cancel: request -> bool
    15   val cancel: request -> bool
    16   val shutdown: unit -> unit
    16   val shutdown: unit -> unit
       
    17   val future: Time.time -> unit future
    17 end;
    18 end;
    18 
    19 
    19 structure Event_Timer: EVENT_TIMER =
    20 structure Event_Timer: EVENT_TIMER =
    20 struct
    21 struct
    21 
    22 
   123     if not (Requests.is_empty requests)
   124     if not (Requests.is_empty requests)
   124     then raise Fail "Cannot shutdown event timer: pending requests"
   125     then raise Fail "Cannot shutdown event timer: pending requests"
   125     else if is_none manager then SOME ((), init_state)
   126     else if is_none manager then SOME ((), init_state)
   126     else NONE);
   127     else NONE);
   127 
   128 
       
   129 
       
   130 (* future *)
       
   131 
       
   132 val future = uninterruptible (fn _ => fn time =>
       
   133   let
       
   134     val req: request Single_Assignment.var = Single_Assignment.var "request";
       
   135     fun abort () = ignore (cancel (Single_Assignment.await req));
       
   136     val promise: unit future = Future.promise abort;
       
   137     val _ = Single_Assignment.assign req (request time (Future.fulfill promise));
       
   138   in promise end);
       
   139 
   128 end;
   140 end;
   129 
   141