Re: Stretching the Storage Manager a little too much...

2007-01-30 Thread Simon Marlow

Michael Weber wrote:
[I am reading ghc-bugs via the list archives, Cc'ing me would make me 
see responses faster]


Here's a simple memoization function:

applyMemo :: (Eq a1,Show a1) = (a1 - b) - MVar [(a1,b)] - (a1 - b)
applyMemo f refTable x1 = unsafePerformIO $ do
-- print x1
table - takeMVar refTable
let key = x1
case lookup key table of
  Nothing - do
let result = f x1
putMVar refTable $! (key,result):table
return result
  Just memo - putMVar refTable table  return memo


The code above is a cut-down example.  Initially, I tried to use 
Data.HashTable, then IORef (Data.Map ...), then MVars.  However, what 
remains is that I get funny results: loop, thread blocked 
indefinitely, hangs, depending on the exact implementation of 
applyMemo, whether I use ghci or ghc, and which function I memoize 
(something with a more interesting call pattern than fib).


Would you mind submitting a complete test case that we can use to reproduce the 
problem?  We can probably reconstruct one from your description, but you 
probably already have the code lying around.


Cheers,
Simon
___
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs


Stretching the Storage Manager a little too much...

2007-01-29 Thread Michael Weber
[I am reading ghc-bugs via the list archives, Cc'ing me would make me  
see responses faster]


Here's a simple memoization function:

applyMemo :: (Eq a1,Show a1) = (a1 - b) - MVar [(a1,b)] - (a1 - b)
applyMemo f refTable x1 = unsafePerformIO $ do
-- print x1
table - takeMVar refTable
let key = x1
case lookup key table of
  Nothing - do
let result = f x1
putMVar refTable $! (key,result):table
return result
  Just memo - putMVar refTable table  return memo


The code above is a cut-down example.  Initially, I tried to use  
Data.HashTable, then IORef (Data.Map ...), then MVars.  However, what  
remains is that I get funny results: loop, thread blocked  
indefinitely, hangs, depending on the exact implementation of  
applyMemo, whether I use ghci or ghc, and which function I memoize  
(something with a more interesting call pattern than fib).


This is with ghc-6.6 from haskell.org on MacOSX/Intel, same hangs on  
amd64-linux.


I have some speculation what's going wrong, namely that one version  
of the unsafePerformIO code is interrupted by another (triggered by  
some lazy computation), the latter then blocks on the MVar, and the  
RTS cannot proceed.


Oh, and uncommenting the print statement makes the error go away,  
presumably because x1 is fully evaluated?


Anyway, this code is more or less lifted from the Stretching the  
Storage Manager paper [1], and since then there have been quite some  
invasive changes to the RTS, if I am not mistaken.


What am I doing wrong, and how can I do it right? :)

(If pressed I could provide actual code which triggers the bug, but  
it will take me a while to extract it, and also I would rather have  
it not public for now.)



Cheers,
Michael

[1] http://research.microsoft.com/Users/simonpj/Papers/weak.ps.gz


___
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs