[Haskell-beginners] Hints on how to remove unsafePerformIO from my function?

Benjamin Edwards edwards.benj at gmail.com
Mon Jul 19 10:12:32 EDT 2010


fork it into a thread and have it run on a loop, yielding if it can't read
any data from the udp socket?

On 19 July 2010 16:07, David McBride <dmcbride at neondsl.com> wrote:

> I am writing a voip server to take advantage of haskells awesome threading
> and parsing ability.  At first everything was going great, but my thread
> that fetches udp makes use of unsafePerformIO:
>
> fetchUDPSIP :: TChan B.ByteString -> IO ()
> fetchUDPSIP chan = do
>   sock <- getUDPSocket 5060
>   let results = (unstrict . repeat . getUDP) sock
>   mapM_ (atomically . writeTChan chan) results
>   where
>     unstrict [] = []
>     unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
>
> It fetches it from a socket, and then writes it to a TChan.  This results
> in a stream of bytestrings that another thread can read from.  If I don't
> use unsafePerformIO, then it tries to read all possible packets before
> returning anything, and so it never writes to the TChan at all.  The problem
> with doing it this way is that unsafePerformIO apparently stops every other
> thread from doing anything while it is waiting for a packet.
>
> But I can't think of a way to rewrite this function to do what I want.  I'm
> kind of new to this, does anyone have any hints that could help me out?
>
> Here's a simple version without any of the implementation details:
>
> fetchLine = do
>   let results = (unstrict . repeat) getLine
>   mapM_ putStrLn results
>   where
>     unstrict [] = []
>     unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100719/8d12f717/attachment.html


More information about the Beginners mailing list