Is this a concurrency bug in base?
Jean-Marie Gaillourdet
jmg at gaillourdet.net
Sun Oct 9 18:33:47 CEST 2011
On 09.10.2011, at 18:13, Daniel Fischer wrote:
> On Sunday 09 October 2011, 17:51:06, Jean-Marie Gaillourdet wrote:
>>> That sounds plausible. Do you see any workaround? Perhaps repeatedly
>>> evaluating typeOf?
>>
>> typeOf' seems to be a working workaround:
>>
>> typeOf' val
>> | t1 == t2 = t1
>> | otherwise = typeOf' val
>> where
>> t1 = typeOf'' val
>> t2 = typeOf''' val
>> {-# NOINLINE typeOf' #-}
>>
>>
>> typeOf'' x = typeOf x
>> {-# NOINLINE typeOf'' #-}
>> typeOf''' x = typeOf x
>> {-# NOINLINE typeOf''' #-}
>
> That'll make it very improbable to get bad results, but not impossible.
>
> Thread1: typeOf' (); typeOf'' (), lookup, not there
> Thread2: typeOf' (); typeOf'' (), lookup, not there
> Thread1: create and insert; typeOf''' (), entry present, use ~> Key 0
> Thread2: create and insert, overwites entry with Key 0,
> new entry has Key 1; typeOf''' (), entry present, use ~> Key 1
>
> It will probably take a long time until it bites, but when it does, it will
> hurt.
> A proper fix would need a lock to ensure only one thread at a time can
> access the cache.
Ok, you're right. I tried to avoid the IO monad, but there seems to be no way around it.
More information about the Glasgow-haskell-users
mailing list