lean4-htt/tests/lean/run/taskState.lean
Sebastian Ullrich 7c79f05cd4
feat: API to avoid deadlocks from dropped promises (#6958)
This PR improves the `Promise` API by considering how dropped promises
can lead to never-finished tasks.
2025-02-07 15:33:10 +00:00

25 lines
1.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

def assertBEq [BEq α] [ToString α] (caption : String) (actual expected : α) : IO Unit := do
unless actual == expected do
throw <| IO.userError <|
s!"{caption}: expected '{expected}', got '{actual}'"
def test : IO Unit := do
let p1 : IO.Promise Unit ← IO.Promise.new -- resolving queues the task
let p2 : IO.Promise Unit ← IO.Promise.new -- resolved once task is running
let p3 : IO.Promise Unit ← IO.Promise.new -- resolving finishes the task
let t ← BaseIO.mapTask (fun _ => do p2.resolve (); IO.wait p3.result?) p1.result?
assertBEq "p1" (← IO.getTaskState p1.result?) .running
assertBEq "p2" (← IO.getTaskState p2.result?) .running
assertBEq "p3" (← IO.getTaskState p3.result?) .running
assertBEq "t" (← IO.getTaskState t) .waiting
p1.resolve ()
assertBEq "p1" (← IO.getTaskState p1.result?) .finished
let _ ← IO.wait p2.result?
assertBEq "p2" (← IO.getTaskState p2.result?) .finished
assertBEq "t" (← IO.getTaskState t) .running
p3.resolve ()
assertBEq "p3" (← IO.getTaskState p3.result?) .finished
let _ ← IO.wait t
assertBEq "t" (← IO.getTaskState t) .finished
#eval test