+++ /dev/null
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
- <head>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
- <title>The GHC Commentary - why we have <tt>ForeignPtr</tt></title>
- </head>
-
- <body BGCOLOR="FFFFFF">
-
- <h1>On why we have <tt>ForeignPtr</tt></h1>
-
- <p>Unfortunately it isn't possible to add a finalizer to a normal
- <tt>Ptr a</tt>. We already have a generic finalization mechanism:
- see the Weak module in package lang. But the only reliable way to
- use finalizers is to attach one to an atomic heap object - that
- way the compiler's optimiser can't interfere with the lifetime of
- the object.
-
- <p>The <tt>Ptr</tt> type is really just a boxed address - it's
- defined like
-
- <pre>
-data Ptr a = Ptr Addr#
-</pre>
-
- <p>where <tt>Addr#</tt> is an unboxed native address (just a 32-
- or 64- bit word). Putting a finalizer on a <tt>Ptr</tt> is
- dangerous, because the compiler's optimiser might remove the box
- altogether.
-
- <p><tt>ForeignPtr</tt> is defined like this
-
- <pre>
-data ForeignPtr a = ForeignPtr ForeignObj#
-</pre>
-
- <p>where <tt>ForeignObj#</tt> is a *boxed* address, it corresponds
- to a real heap object. The heap object is primitive from the
- point of view of the compiler - it can't be optimised away. So it
- works to attach a finalizer to the <tt>ForeignObj#</tt> (but not
- to the <tt>ForeignPtr</tt>!).
-
- <p>There are several primitive objects to which we can attach
- finalizers: <tt>MVar#</tt>, <tt>MutVar#</tt>, <tt>ByteArray#</tt>,
- etc. We have special functions for some of these: eg.
- <tt>MVar.addMVarFinalizer</tt>.
-
- <p>So a nicer interface might be something like
-
-<pre>
-class Finalizable a where
- addFinalizer :: a -> IO () -> IO ()
-
-instance Finalizable (ForeignPtr a) where ...
-instance Finalizable (MVar a) where ...
-</pre>
-
- <p>So you might ask why we don't just get rid of <tt>Ptr</tt> and
- rename <tt>ForeignPtr</tt> to <tt>Ptr</tt>. The reason for that
- is just efficiency, I think.
-
- <p><small>
-<!-- hhmts start -->
-Last modified: Wed Sep 26 09:49:37 BST 2001
-<!-- hhmts end -->
- </small>
- </body>
-</html>