1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
{-# LANGUAGE OverloadedStrings #-}
--
-- Test HashECM with threads
--
module TestHashECMWithThreads (
testWithThreads
) where
import Control.Concurrent (forkIO, threadDelay, yield)
import qualified Data.Time.Clock.POSIX as POSIX (POSIXTime, getPOSIXTime)
import qualified Data.ByteString.Lazy.Char8 as LBS
import qualified Control.Concurrent.MVar as MV
import qualified Data.HashMap.Strict as HM
import Data.Hashable (Hashable(..))
import Caching.ExpiringCacheMap.HashECM
import Caching.ExpiringCacheMap.Internal.Internal (getStatsString)
import System.Timeout (timeout)
import System.Exit (exitFailure)
testWithThreads = do
res <- timeout 60000000 testWithThreads'
case res of
Nothing -> exitFailure
Just () -> return ()
testWithThreads' = do
ecm <- newECMIO
(consistentDuration 10
(\state id -> do LBS.putStrLn id; return (state, [])))
(do time <- POSIX.getPOSIXTime
return (round (time * 100)))
120
(CacheWithLRUList 6 6 12) :: IO (ECM IO MV.MVar () HM.HashMap LBS.ByteString [Int])
t1 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.2"
yield --threadDelay 2
return ())
[0..500]
MV.putMVar t1 True
t2 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.3"
yield --threadDelay 3
return ())
[0..333]
MV.putMVar t2 True
t3 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.5"
yield -- threadDelay 5
return ())
[0..200]
MV.putMVar t3 True
t4 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.7"
yield -- threadDelay 7
return ())
[0..142]
MV.putMVar t4 True
t5 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.11"
yield -- threadDelay 11
return ())
[0..90]
MV.putMVar t5 True
t6 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.13"
yield -- threadDelay 13
return ())
[0..76]
MV.putMVar t6 True
t7 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.17"
yield -- threadDelay 17
return ())
[0..58]
MV.putMVar t7 True
t8 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.19"
yield -- threadDelay 19
return ())
[0..52]
MV.putMVar t8 True
t9 <- MV.newEmptyMVar
forkIO $ do
mapM_ (\a -> do
b <- lookupECM ecm "test.23"
yield -- threadDelay 23
return ())
[0..43]
MV.putMVar t9 True
untilDone [t1,t2,t3,t4,t5,t6,t7,t8,t9]
c <- getStatsString ecm
putStrLn c
return ()
where
untilDone [] = return ()
untilDone (t:tr) = MV.takeMVar t >> untilDone tr
|