equal
deleted
inserted
replaced
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)); |