-- Idris2 import System import System.Concurrency -- Test `conditionWaitTimeout` times out m of n threads for 1 main and n child -- threads main : IO () main = let n = 5 m = 3 in do cvMutex <- makeMutex cv <- makeCondition -- spawn n-m inifinitely patient children waiting <- for [1..(n - m)] $ \_ => fork $ do mutexAcquire cvMutex conditionWait cv cvMutex putStrLn "Woke up despite no timeout (SHOULDN'T HAPPEN)" mutexRelease cvMutex -- spawn m impatient children impatients <- for [1..m] $ \_ => fork $ do mutexAcquire cvMutex conditionWaitTimeout cv cvMutex 1000000 putStrLn "Where are you mother?" mutexRelease cvMutex sleep m putStrLn "Sorry I'm late children! Weren't there more of you?..." for impatients $ \t => threadWait t sleep 1