packages feed

raw-feldspar-0.1: examples/Concurrent.hs

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Concurrent where



import qualified Prelude

import Feldspar.Run
import Feldspar.Run.Concurrent
import Feldspar.Data.Vector


-- | Waiting for thread completion.
waiting :: Run ()
waiting = do
  t <- fork $ printf "Forked thread printing %d\n" (0 :: Data Int32)
  waitThread t
  printf "Main thread printing %d\n" (1 :: Data Int32)

-- | A thread kills itself using its own thread ID.
suicide :: Run ()
suicide = do
  tid <- forkWithId $ \tid -> do
    printf "This is printed. %d\n" (0 :: Data Int32)
    killThread tid
    printf "This is not. %d\n" (0 :: Data Int32)
  waitThread tid
  printf "The thread is dead, long live the thread! %d\n" (0 :: Data Int32)




primChan :: Run ()
primChan = do
    let n = 7
    c :: Chan Closeable (Data Word32) <- newCloseableChan (n + 1)
    writer <- fork $ do
        printf "Writer started\n"
        writeChan c n
        arr <- constArr [1..n]
        writeChanBuf c 0 n arr
        printf "Writer ended\n"
    reader <- fork $ do
        printf "Reader started\n"
        v <- readChan c
        arr <- newArr v
        readChanBuf c 0 v arr
        printf "Received:"
        for (0, 1, Excl v) $ \i -> do
            e <- getArr arr i
            printf " %d" e
        printf "\n"
    waitThread reader
    waitThread writer
    closeChan c

pairChan :: Run ()
pairChan = do
    c :: Chan Closeable (Data Int32, Data Word8) <- newCloseableChan 10
    writer <- fork $ do
        printf "Writer started\n"
        writeChan c (1337,42)
        printf "Writer ended\n"
    reader <- fork $ do
        printf "Reader started\n"
        (a,b) <- readChan c
        printf "Received: (%d, %d)\n" a b
    waitThread reader
    waitThread writer
    closeChan c

vecChan :: Run ()
vecChan = do
    c :: Chan Closeable (Pull (Data Index)) <- newCloseableChan (3 `ofLength` 10)
    writer <- fork $ do
        printf "Writer started\n"
        let v = fmap (+1) (0 ... 9)
        writeChan c v
        printf "Writer ended\n"
    reader <- fork $ do
        printf "Reader started\n"
        v <- readChan c
        for (0, 1, Excl 10) $ \i -> do
            printf "Received: (%d => %d)\n" i (v ! i)
    waitThread reader
    waitThread writer
    closeChan c


runStorableChanTest = mapM_ (runCompiled' def opts) prog
  where
    prog = [ primChan, pairChan, vecChan ]
    opts = def
         { externalFlagsPost = ["-lpthread"]
         , externalFlagsPre  = [ "-I../imperative-edsl/include"
                               , "../imperative-edsl/csrc/chan.c" ] }



----------------------------------------

testAll = do
    tag "waiting" >> compareCompiled' def opts waiting (runIO waiting) ""
    tag "suicide" >> compareCompiled' def opts suicide (runIO suicide) ""
  where
    tag str = putStrLn $ "---------------- examples/Concurrent.hs/" Prelude.++ str Prelude.++ "\n"
    opts = def {externalFlagsPost = ["-lpthread"]}