@@ -443,29 +443,34 @@ testMergeChannels transport = do
444 -- Single layer of merging
444 -- Single layer of merging
445 testFlat :: LocalNode -> Bool -> String -> IO ()
445 testFlat :: LocalNode -> Bool -> String -> IO ()
446− testFlat localNode biased expected =
446+ testFlat localNode biased expected = do
447+ done <- newEmptyMVar
447− runProcess localNode $ do
448+ forkProcess localNode $ do
448 rs <- mapM charChannel "abc"
449 rs <- mapM charChannel "abc"
449 m <- mergePorts biased rs
450 m <- mergePorts biased rs
450 xs <- replicateM 9 $ receiveChan m
451 xs <- replicateM 9 $ receiveChan m
451 True <- return $ xs == expected
452 True <- return $ xs == expected
452− return ()
453+ liftIO $ putMVar done ()
454 -- Two layers of merging
456 -- Two layers of merging
455 testNested :: LocalNode -> Bool -> Bool -> String -> IO ()
457 testNested :: LocalNode -> Bool -> Bool -> String -> IO ()
456− testNested localNode biasedInner biasedOuter expected =
458+ testNested localNode biasedInner biasedOuter expected = do
459+ done <- newEmptyMVar
457− runProcess localNode $ do
460+ forkProcess localNode $ do
458 rss <- mapM (mapM charChannel) ["abc", "def", "ghi"]
461 rss <- mapM (mapM charChannel) ["abc", "def", "ghi"]
459 ms <- mapM (mergePorts biasedInner) rss
462 ms <- mapM (mergePorts biasedInner) rss
460 m <- mergePorts biasedOuter ms
463 m <- mergePorts biasedOuter ms
461 xs <- replicateM (9 * 3) $ receiveChan m
464 xs <- replicateM (9 * 3) $ receiveChan m
462 True <- return $ xs == expected
465 True <- return $ xs == expected
463− return ()
466+ liftIO $ putMVar done ()
465 -- Test that if no messages are (immediately) available, the scheduler makes no difference
469 -- Test that if no messages are (immediately) available, the scheduler makes no difference
466 testBlocked :: LocalNode -> Bool -> IO ()
470 testBlocked :: LocalNode -> Bool -> IO ()
467 testBlocked localNode biased = do
471 testBlocked localNode biased = do
468 vs <- replicateM 3 newEmptyMVar
472 vs <- replicateM 3 newEmptyMVar
473+ done <- newEmptyMVar
470 forkProcess localNode $ do
475 forkProcess localNode $ do
471 [sa, sb, sc] <- liftIO $ mapM readMVar vs
476 [sa, sb, sc] <- liftIO $ mapM readMVar vs
@@ -496,13 +501,15 @@ testMergeChannels transport = do
496 , (sa, 'a')
501 , (sa, 'a')
499− runProcess localNode $ do
504+ forkProcess localNode $ do
500 (ss, rs) <- unzip <$> replicateM 3 newChan
505 (ss, rs) <- unzip <$> replicateM 3 newChan
501 liftIO $ mapM_ (uncurry putMVar) $ zip vs ss
506 liftIO $ mapM_ (uncurry putMVar) $ zip vs ss
502 m <- mergePorts biased rs
507 m <- mergePorts biased rs
503 xs <- replicateM (6 * 3) $ receiveChan m
508 xs <- replicateM (6 * 3) $ receiveChan m
504 True <- return $ xs == "abcacbbacbcacabcba"
509 True <- return $ xs == "abcacbbacbcacabcba"
505− return ()
510+ liftIO $ putMVar done ()
507 mergePorts :: Serializable a => Bool -> [ReceivePort a] -> Process (ReceivePort a)
514 mergePorts :: Serializable a => Bool -> [ReceivePort a] -> Process (ReceivePort a)
508 mergePorts True = mergePortsBiased
515 mergePorts True = mergePortsBiased