summaryrefslogtreecommitdiff
path: root/testsuite/tests/ffi/should_run/ffi020.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/ffi/should_run/ffi020.hs')
-rw-r--r--testsuite/tests/ffi/should_run/ffi020.hs25
1 files changed, 25 insertions, 0 deletions
diff --git a/testsuite/tests/ffi/should_run/ffi020.hs b/testsuite/tests/ffi/should_run/ffi020.hs
new file mode 100644
index 0000000000..d2236f5791
--- /dev/null
+++ b/testsuite/tests/ffi/should_run/ffi020.hs
@@ -0,0 +1,25 @@
+import Foreign
+import Data.Word
+import Control.Monad
+import System.Mem
+
+main = do
+ let finalize p = do
+ putStrLn ("finalize: " ++ show p)
+ free p
+ allocToForeignPtr finalize (mallocBytes 4096)
+ forever performGC
+
+allocToForeignPtr :: (Ptr a -> IO ()) -- finalizer
+ -> IO (Ptr a) -- allocate
+ -> IO (ForeignPtr a)
+allocToForeignPtr fin alloc = do
+ done <- asFinalizer fin
+ newForeignPtr done =<< alloc
+
+asFinalizer :: (Ptr a -> IO ()) -> IO (FinalizerPtr a)
+asFinalizer = mkFinalizer
+foreign import ccall "wrapper"
+ mkFinalizer :: (Ptr a -> IO ())
+ -> IO (FinalizerPtr a)
+