diff options
Diffstat (limited to 'testsuite/tests/ffi/should_run/ffi020.hs')
-rw-r--r-- | testsuite/tests/ffi/should_run/ffi020.hs | 25 |
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) + |