fun unregister (urgent, message) thread =
Synchronized.change global_state
(fn state as {manager, timeout_heap, active, canceling, messages} =>
(case lookup_thread active thread of
SOME (tool, _, _, desc as (worker, its_desc)) => let val active' = delete_thread thread active val now = Time.now () val canceling' = (thread, (tool, now, desc)) :: canceling val message' =
(worker, its_desc ^ (if message = ""then""else"\n" ^ message)) val messages' = (urgent, (tool, message')) :: messages in make_state manager timeout_heap active' canceling' messages' end
| NONE => state))
val min_wait_time = seconds 0.3 val max_wait_time = seconds 10.0
fun check_thread_manager () = Synchronized.change global_state
(fn state as {manager, timeout_heap, active, canceling, messages} => if (case manager of SOME thread => Isabelle_Thread.is_active thread | NONE => false) then state elseletval manager = SOME (Isabelle_Thread.fork (Isabelle_Thread.params "async_manager") (fn () => let fun time_limit timeout_heap =
(casetry Thread_Heap.min timeout_heap of
NONE => Time.now () + max_wait_time
| SOME (time, _) => time)
(*action: find threads whose timeout is reached, and interrupt canceling threads*) fun action {manager, timeout_heap, active, canceling, messages} = letval (timeout_threads, timeout_heap') =
Thread_Heap.upto (Time.now (), Isabelle_Thread.self ()) timeout_heap in if null timeout_threads andalso null canceling then
NONE else let val _ = List.app (Isabelle_Thread.interrupt_thread o #1) canceling val canceling' = filter (Isabelle_Thread.is_active o #1) canceling val state' = make_state manager timeout_heap' active canceling' messages in SOME (map #2 timeout_threads, state') end end in while Synchronized.change_result global_state
(fn state as {timeout_heap, active, canceling, messages, ...} => if null active andalso null canceling andalso null messages then (false, make_state NONE timeout_heap active canceling messages) else (true, state)) do
(Synchronized.timed_access global_state
(SOME o time_limit o #timeout_heap) action
|> these
|> List.app (unregister (false, "Timed out"));
print_new_messages (); (* give threads some time to respond to interrupt *)
OS.Process.sleep min_wait_time) end)) in make_state manager timeout_heap active canceling messages end)
fun register tool birth_time death_time desc thread =
(Synchronized.change global_state
(fn {manager, timeout_heap, active, canceling, messages} => let val timeout_heap' = Thread_Heap.insert (death_time, thread) timeout_heap val active' = update_thread (thread, (tool, birth_time, death_time, desc)) active val state' = make_state manager timeout_heap' active' canceling messages in state' end);
check_thread_manager ())
fun thread tool birth_time death_time desc f =
(Isabelle_Thread.fork (Isabelle_Thread.params "async_worker" |> Isabelle_Thread.interrupts)
(fn () => let val self = Isabelle_Thread.self () val _ = register tool birth_time death_time desc self in unregister (f ()) self end);
())
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.