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