diff -r 29c13d8813cb -r 183c345b063e src/Pure/Concurrent/event_timer.ML --- a/src/Pure/Concurrent/event_timer.ML Wed Feb 20 20:03:42 2019 +0100 +++ b/src/Pure/Concurrent/event_timer.ML Wed Feb 20 21:20:30 2019 +0100 @@ -22,14 +22,22 @@ (* type request *) -val request_id = Counter.make (); +datatype request = + Request of {id: int, time: Time.time, event: unit -> unit}; + +val new_id = Counter.make (); -datatype request = Request of {id: int, event: unit -> unit}; - -fun new_request event = Request {id = request_id (), event = event}; +fun new_request time event = + Request { + id = new_id (), + time = time, + event = event}; fun eq_request (Request {id = id1, ...}, Request {id = id2, ...}) = id1 = id2; +fun request_time (Request {time, ...}) = time; +fun request_event (Request {event, ...}) = event; + (* type requests *) @@ -54,19 +62,19 @@ fun next_time (requests: requests) = Option.map #1 (Requests.min requests); -fun next_event time (requests: requests) = +fun next_event now (requests: requests) = (case Requests.min requests of NONE => NONE | SOME (req_time, reqs) => - if time < req_time then NONE + if now < req_time then NONE else let - val (reqs', Request {event, ...}) = split_last reqs; + val (reqs', req) = split_last reqs; val requests' = if null reqs' then Requests.delete req_time requests else Requests.update (req_time, reqs') requests; - in SOME (event, requests') end); + in SOME (request_event req, requests') end); (* global state *) @@ -139,7 +147,7 @@ fun request time event = Synchronized.change_result state (fn State {requests, status, manager} => let - val req = new_request event; + val req = new_request time event; val requests' = add time req requests; val manager' = manager_check manager; in (req, make_state (requests', status, manager')) end);