src/Pure/Concurrent/event_timer.ML
changeset 62891 7a11ea5c9626
parent 62826 eb94e570c1a4
child 62923 3a122e1e352a
equal deleted inserted replaced
62890:728aa05e9433 62891:7a11ea5c9626
   107   else
   107   else
   108     SOME (Standard_Thread.fork {name = "event_timer", stack_limit = NONE, interrupts = false}
   108     SOME (Standard_Thread.fork {name = "event_timer", stack_limit = NONE, interrupts = false}
   109       manager_loop);
   109       manager_loop);
   110 
   110 
   111 fun shutdown () =
   111 fun shutdown () =
   112   uninterruptible (fn restore_attributes => fn () =>
   112   Multithreading.uninterruptible (fn restore_attributes => fn () =>
   113     if Synchronized.change_result state (fn st as State {requests, manager, ...} =>
   113     if Synchronized.change_result state (fn st as State {requests, manager, ...} =>
   114       if is_shutdown Normal st then (false, st)
   114       if is_shutdown Normal st then (false, st)
   115       else if is_shutdown Shutdown_Ack st orelse is_shutdown_req st then
   115       else if is_shutdown Shutdown_Ack st orelse is_shutdown_req st then
   116         raise Fail "Concurrent attempt to shutdown event timer"
   116         raise Fail "Concurrent attempt to shutdown event timer"
   117       else (true, make_state (requests, Shutdown_Req, manager_check manager)))
   117       else (true, make_state (requests, Shutdown_Req, manager_check manager)))
   142     let
   142     let
   143       val (canceled, requests') = del_request req requests;
   143       val (canceled, requests') = del_request req requests;
   144       val manager' = manager_check manager;
   144       val manager' = manager_check manager;
   145     in (canceled, make_state (requests', status, manager')) end);
   145     in (canceled, make_state (requests', status, manager')) end);
   146 
   146 
   147 val future = uninterruptible (fn _ => fn time =>
   147 val future = Multithreading.uninterruptible (fn _ => fn time =>
   148   let
   148   let
   149     val req: request Single_Assignment.var = Single_Assignment.var "request";
   149     val req: request Single_Assignment.var = Single_Assignment.var "request";
   150     fun abort () = ignore (cancel (Single_Assignment.await req));
   150     fun abort () = ignore (cancel (Single_Assignment.await req));
   151     val promise: unit future = Future.promise abort;
   151     val promise: unit future = Future.promise abort;
   152     val _ = Single_Assignment.assign req (request time (Future.fulfill promise));
   152     val _ = Single_Assignment.assign req (request time (Future.fulfill promise));