
Hello Cafe I'm currently writing an app with heavy use of message passing. To see which messages takes most of the bandwidth I wrote the following code: -- data Counter = CNT !Int !Int !Int !Int cntMsg (CNT a b c d) (MoveOther _ _) = (CNT a+1 b c d) cntMsg (CNT a b c d) (MoveSelf _) = (CNT a b+1 c d) cntMsg (CNT a b c d) (NilMsg) = (CNT a b c+1 d) cntMsg (CNT a b c d) (RoundEnd) = (CNT a b c d+1) emptyCnt = CNT 0 0 0 0 showCnt (CNT a b c d) = printf "CNT MoveOther=%d MoveSelf=%d NilMsg=%d RoundEnd=%d" a b c d -- The code for modifying the counter: (\ msg -> atomicModifyIORef ioref (\ cnt -> (cntMsg cnt msg,()))) Running it without increased stack blows it. With 200M stack I get after a second or so: CNT MoveOther=2125764 MoveSelf=0 NilMsg=0 RoundEnd=2916 The datatype itself is strict. So where is the thunk actually accumulating? Best regards Christopher Skrzętnicki