[Haskell-cafe] Multicast receiver thread fails to receive last few messages

Carter Schonwald carter.schonwald at gmail.com
Tue Sep 23 19:14:51 UTC 2014


altenratively, you can compile your module with -fno-omit-yields, which
adds a yield to no allocation loops

On Tue, Sep 23, 2014 at 2:26 PM, Ben Gunton <ben.gunton at gmail.com> wrote:

> Indeed, this was the issue. Took Benno's advice and added a yield, and it
> works as I hoped it would. Thanks!
>
> On Tue, Sep 23, 2014 at 10:46 AM, Gregory Collins <greg at gregorycollins.net
> > wrote:
>
>> Since this is UDP, you may be overflowing your device queue. Linux
>> helpfully won't return ENOBUFS in this case but will instead just drop the
>> packet on the floor. The threadDelay fixes this by yielding the processor
>> so that the consumer thread can dequeue packets.
>>
>> G
>>
>> On Tue, Sep 23, 2014 at 8:14 AM, Ben Gunton <ben.gunton at gmail.com> wrote:
>>
>>> I am trying to send multicast messages from one thread, and receive them
>>> on another. The sending thread reads lines from a file and sends them.
>>> However, the receiving thread does not receive all the messages - it seems
>>> to miss the last 10 message or so. If I run other programs to listen for
>>> the multicast message, they receive them fine. So I think the issue is
>>> something to do with receiving, not sending. I keep the program alive with
>>> a threadDelay, so it shouldn't be halting prematurely. If I add a small
>>> delay after each send, it works fine. And if I make the input file smaller,
>>> it works fine.
>>>
>>> On the provided data file, on my system (64-bit Ubuntu, GHC 7.8.2), the
>>> receiver fails to receive lines 125-140. Compiled with no optimizations.
>>>
>>> Thanks for any help!
>>>
>>> The relevant code snippets are below, and the sample data file and full
>>> program are attached.
>>>
>>>     -- Loop to receive all the packets
>>>     let receiveMulticast = do
>>>             (msg, _) <- recvFrom recvSock 32628
>>>             putStrLn . BS.unpack $ BS.take 100 msg
>>>             receiveMulticast
>>>     _ <- forkIO receiveMulticast
>>>
>>>     -- Send every line from a file as multicast message
>>>     inputFile <- openFile "data" ReadMode
>>>     fileLines <- BS.lines <$> BS.hGetContents inputFile
>>>     let sendMulticast msg = do
>>>             sendTo sendSock msg addr
>>>             -- Receiver FAILS to receive last few messages unless this
>>>             -- thread delay exists... why?!
>>>             -- threadDelay (1)
>>>     mapM_ sendMulticast fileLines
>>>     hClose inputFile
>>>
>>>     threadDelay (1000*1000*1000) -- Delay for 1000 seconds
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>>
>>
>>
>> --
>> Gregory Collins <greg at gregorycollins.net>
>>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140923/77fc7791/attachment.html>


More information about the Haskell-Cafe mailing list