Re: Help me grok addFinalizer

2012-02-16 Thread Michael Craig
> I haven't checked, but ...

I checked, and your solution works. In the context of a larger program,
getting NOLINE pragmas in all the right places would be challenging,
wouldn't it?

I found a bug report on the GHC Trac [1] in which Simon explains the
importance of evaluating the thunk before calling addFinalizer. (Otherwise
the finalizer is added to the thunk.) This works:

newThing :: IO Thing
newThing = do
  x <- Thing `fmap` newIORef True
  return $ unsafePerformIO ( do
x' <- evaluate x
addFinalizer x' $ putStrLn "running finalizer" ) `seq` x

If anyone can show me how to get rid of unsafePerformIO in there, that'd be
great. Tried a few things to no avail.

> Finalizers are tricky things, especially when combined with some of
> GHC's optimisations.

No kidding!

[1] http://hackage.haskell.org/trac/ghc/ticket/5365

Mike Craig



On Thu, Feb 16, 2012 at 4:15 PM, Ian Lynagh  wrote:

> On Thu, Feb 16, 2012 at 02:55:13PM -0600, Austin Seipp wrote:
> > 64-bit GHC on OS X gives me this:
> >
> > $ ghc -fforce-recomp -threaded finalizer
> > [1 of 1] Compiling Main ( finalizer.hs, finalizer.o )
> > Linking finalizer ...
> > $ ./finalizer
> > waiting ...
> > done!
> > waiting ...
> > running finalizer
> > done!
> >
> > However, it's a different story when `-O2` is specified:
> >
> > $ ghc -O2 -fforce-recomp -threaded finalizer
> > [1 of 1] Compiling Main ( finalizer.hs, finalizer.o )
> > Linking finalizer ...
> > $ ./finalizer
> > waiting ...
> > running finalizer
> > done!
> > waiting ...
> > done!
> >
> > This smells like a bug. The stranger thing is that the GC will run the
> > finalizer, but it doesn't reclaim the object? I'd think `readIORef`
> > going after an invalidated pointer the GC reclaimed would almost
> > certainly crash.
>
> The finalizer is attached to the Thing, not the IORef. I haven't
> checked, but I assume that ioref gets inlined, so effectively (ioref x)
> is evaluated early. If you change it to
>
>readIORef (ioref' x) >>= \ix -> ix `seq` return ()
>
> and define
>
>{-# NOINLINE ioref' #-}
>ioref' :: Thing -> IORef Bool
>ioref' = ioref
>
> then you'll get the sort of output you expect.
>
> Finalizers are tricky things, especially when combined with some of
> GHC's optimisations.
>
>
> Thanks
> Ian
>
>
> ___
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users@haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>
___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


Re: Help me grok addFinalizer

2012-02-16 Thread Michael Craig
> This seems to be an explanation of why a finalizer might run later than
expected (or not run at all). But his paste shows that it runs *earlier*
than what he expected.

What he said.

> 64-bit GHC on OS X gives me this:
>
> ...
>
> However, it's a different story when `-O2` is specified:
>
> ...

You're right. I was compiling with cabal and had -O turned on without
knowing it. So this looks like an optimization bug?

Mike Craig



On Thu, Feb 16, 2012 at 3:55 PM, Austin Seipp  wrote:

> 64-bit GHC on OS X gives me this:
>
> $ ghc -fforce-recomp -threaded finalizer
> [1 of 1] Compiling Main ( finalizer.hs, finalizer.o )
> Linking finalizer ...
> $ ./finalizer
> waiting ...
> done!
> waiting ...
> running finalizer
> done!
>
> However, it's a different story when `-O2` is specified:
>
> $ ghc -O2 -fforce-recomp -threaded finalizer
> [1 of 1] Compiling Main ( finalizer.hs, finalizer.o )
> Linking finalizer ...
> $ ./finalizer
> waiting ...
> running finalizer
> done!
> waiting ...
> done!
>
> This smells like a bug. The stranger thing is that the GC will run the
> finalizer, but it doesn't reclaim the object? I'd think `readIORef`
> going after an invalidated pointer the GC reclaimed would almost
> certainly crash.
>
> On Thu, Feb 16, 2012 at 2:04 PM, Michael Craig  wrote:
> > When I read the docs for System.Mem.Weak, it all seems to make sense. But
> > then this code doesn't run as I expect it to when I turn on
> > -threaded: http://hpaste.org/63832 (Expected/actual output are listed
> in the
> > paste.)
> >
> > I've tried this on 7.4.1 and 7.0.4 with the same results. Can someone
> > enlighten me?
> >
> > Cheers,
> > Mike Craig
> >
> >
> > ___
> > Glasgow-haskell-users mailing list
> > Glasgow-haskell-users@haskell.org
> > http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
> >
>
>
>
> --
> Regards,
> Austin
>
___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


Help me grok addFinalizer

2012-02-16 Thread Michael Craig
When I read the docs for System.Mem.Weak, it all seems to make sense. But
then this code doesn't run as I expect it to when I turn on -threaded:
http://hpaste.org/63832 (Expected/actual output are listed in the paste.)

I've tried this on 7.4.1 and 7.0.4 with the same results. Can someone
enlighten me?

Cheers,
Mike Craig
___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users