
Thank you for your answer.
Does it work if you change:
forM_ [1..1000000] $ \x -> do send socket (show x) threadDelay (10*1000)
to:
forM_ [1..1000000] $ \x -> do send socket (show x) touch socket threadDelay (10*1000)
Yes, that works.
I'm guessing what happens is that optimizations make the 'Socket' constructor go away, so the finalizer runs as soon as it can. The 'touch' function might force it to stick around. You'll probably want to look at the low-level compiler output to make sure:
As far as I see you are definitely right. Due to good inlining Socket constructor is not needed in main forM-cycle. After some meditation on core output I added NOINLINE pragma to function "send" and the problem vanished. Is NOINLINE pragma a good workaround in such situation? Thanks, balodja