[GHC] #10415: ForeignPtr touched in FFI wrapper is never discarded

GHC ghc-devs at haskell.org
Thu May 14 03:45:21 UTC 2015


#10415: ForeignPtr touched in FFI wrapper is never discarded
-------------------------------------+-------------------------------------
        Reporter:  Deewiant          |                   Owner:
            Type:  bug               |                  Status:  closed
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.10.1
      Resolution:  invalid           |                Keywords:
Operating System:  Linux             |            Architecture:  x86_64
 Type of failure:  Runtime           |  (amd64)
  performance bug                    |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------
Changes (by rwbarton):

 * status:  new => closed
 * resolution:   => invalid


Comment:

 The `FunPtr`s produced by a wrapper are like `Ptr`s, not `ForeignPtr`s.
 The functions they point to aren't and can't be managed by GC, because you
 can pass one directly to a C function and it can squirrel the pointer away
 in a C data structure somewhere.

 So the wrapped functions in this program live forever, and since they
 refer to the `ForeignPtr` `fp`, the memory managed by that pointer lives
 forever as well.

 You can free the result of a wrapper explicitly with
 [http://hackage.haskell.org/package/base-4.8.0.0/docs/Foreign-
 Ptr.html#v:freeHaskellFunPtr freeHaskellFunPtr]. If you add such a call to
 your program, say, after the `threadDelay`, then the 30 megabyte object
 does get freed.

 Please reopen if I am missing some subtlety here!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10415#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list