'accept' does not seem to be thread friendly ..
Ahn Ki-yung
kyagrd@bawi.org
Tue, 03 Dec 2002 10:59:50 +0900
John Meacham wrote:
>that is what Concurrent is for, Haskell threads, (well GHC threads) are
>lightweight and can be used for selectlike purposes without too much
>overhead. I use them quite effectivly for complex networked
>applications..
>
>see
>http://haskell.org/ghc/docs/latest/html/base/Control.Concurrent.html
>
>
>
Below is my sample code ; the Net Cats
This does not work, because 'accept' fuction of the
Network module blocks the whole process, unlike
Haskell Standard IO functions which blocks its thread
only. How did you work around with complex networked
applications ? It would be very helpful if you could
give us more detailed advice from your expierience.
Network.accept does not seem to be thread friendly.
Then how am I going to keep my server from being blocked
by accept?
\begin{code}
import IO
import Monad
import Network
import Control.Exception (finally)
import Control.Concurrent
hCat inh outh = repeat $ try (hGetLine inh>>=hPutStrLn outh>>hFlush outh)
isRight (Right _) = True
isRight _ = False
dostep actss = filterM ((>>=return.isRight).head) actss
theloop [] = return []
theloop actss = dostep actss >>= theloop
thd_accept lsock mvar = do
actss <- takeMVar mvar
print "trying to accept"
conn@(h,host,port) <- accept lsock
print conn
putMVar mvar (hCat h h:actss)
thd_accept lsock mvar
loopcats mvar = takeMVar mvar >>= dostep >>= putMVar mvar >> loopcats mvar
main = withSocketsDo $ do
lsock <- listenOn $ PortNumber 9000
print lsock
mvar <- newMVar []
forkIO (thd_accept lsock mvar `finally` putMVar mvar [])
loopcats mvar `finally` putMVar mvar []
\end{code}
--
Ahn Ki-yung