diff --git a/src/runtime/haskell/PGF2.hsc b/src/runtime/haskell/PGF2.hsc index 304ade1fd..afe05fc9e 100644 --- a/src/runtime/haskell/PGF2.hsc +++ b/src/runtime/haskell/PGF2.hsc @@ -96,7 +96,6 @@ import Foreign.C import Control.Exception(mask_,bracket) import System.IO.Unsafe(unsafePerformIO) import System.Random -import qualified Foreign.Concurrent as C import qualified Data.Map as Map import Data.IORef import Data.List(intersperse,groupBy) @@ -114,7 +113,7 @@ readPGF fpath = mask_ $ do c_db <- withPgfExn "readPGF" (pgf_read_pgf c_fpath p_revision) c_revision <- peek p_revision - fptr <- C.newForeignPtr c_revision (pgf_free_revision c_db c_revision) + fptr <- newForeignPtrEnv pgf_free_revision c_db c_revision langs <- getConcretes c_db fptr return (PGF c_db fptr langs) @@ -130,7 +129,7 @@ bootNGF pgf_path ngf_path = mask_ $ do c_db <- withPgfExn "bootNGF" (pgf_boot_ngf c_pgf_path c_ngf_path p_revision) c_revision <- peek p_revision - fptr <- C.newForeignPtr c_revision (pgf_free_revision c_db c_revision) + fptr <- newForeignPtrEnv pgf_free_revision c_db c_revision langs <- getConcretes c_db fptr return (PGF c_db fptr langs) @@ -143,7 +142,7 @@ readNGF fpath = mask_ $ do c_db <- withPgfExn "readNGF" (pgf_read_ngf c_fpath p_revision) c_revision <- peek p_revision - fptr <- C.newForeignPtr c_revision (pgf_free_revision c_db c_revision) + fptr <- newForeignPtrEnv pgf_free_revision c_db c_revision langs <- getConcretes c_db fptr return (PGF c_db fptr langs) @@ -159,7 +158,7 @@ newNGF abs_name mb_fpath = mask_ $ do c_db <- withPgfExn "newNGF" (pgf_new_ngf c_abs_name c_fpath p_revision) c_revision <- peek p_revision - fptr <- C.newForeignPtr c_revision (pgf_free_revision c_db c_revision) + fptr <- newForeignPtrEnv pgf_free_revision c_db c_revision return (PGF c_db fptr Map.empty) writePGF :: FilePath -> PGF -> IO () diff --git a/src/runtime/haskell/PGF2/FFI.hsc b/src/runtime/haskell/PGF2/FFI.hsc index 01fae9543..74d925a2f 100644 --- a/src/runtime/haskell/PGF2/FFI.hsc +++ b/src/runtime/haskell/PGF2/FFI.hsc @@ -63,7 +63,9 @@ foreign import ccall pgf_new_ngf :: Ptr PgfText -> CString -> Ptr (Ptr (PgfRevis foreign import ccall pgf_write_pgf :: CString -> Ptr PgfDB -> Ptr (PgfRevision PGF) -> Ptr PgfExn -> IO () -foreign import ccall pgf_free_revision :: Ptr PgfDB -> Ptr (PgfRevision PGF) -> IO () +foreign import ccall "pgf_free_revision" pgf_free_revision_ :: Ptr PgfDB -> Ptr (PgfRevision PGF) -> IO () + +foreign import ccall "&pgf_free_revision" pgf_free_revision :: FinalizerEnvPtr PgfDB (PgfRevision PGF) foreign import ccall pgf_free_concr_revision :: Ptr PgfDB -> Ptr (PgfRevision Concr) -> IO () diff --git a/src/runtime/haskell/PGF2/Transactions.hsc b/src/runtime/haskell/PGF2/Transactions.hsc index 4a073686f..7ee0a6962 100644 --- a/src/runtime/haskell/PGF2/Transactions.hsc +++ b/src/runtime/haskell/PGF2/Transactions.hsc @@ -24,7 +24,6 @@ import PGF2.Expr import Foreign import Foreign.C -import qualified Foreign.Concurrent as C import Control.Exception #include @@ -90,19 +89,19 @@ branchPGF_ c_name p (Transaction f) = then do ((restore (f (a_db p) c_revision c_exn)) `catch` (\e -> do - pgf_free_revision (a_db p) c_revision + pgf_free_revision_ (a_db p) c_revision throwIO (e :: SomeException))) ex_type <- (#peek PgfExn, type) c_exn if (ex_type :: (#type PgfExnType)) == (#const PGF_EXN_NONE) then do pgf_commit_revision (a_db p) c_revision c_exn ex_type <- (#peek PgfExn, type) c_exn if (ex_type :: (#type PgfExnType)) == (#const PGF_EXN_NONE) - then do fptr <- C.newForeignPtr c_revision (pgf_free_revision (a_db p) c_revision) + then do fptr <- newForeignPtrEnv pgf_free_revision (a_db p) c_revision langs <- getConcretes (a_db p) fptr return (PGF (a_db p) fptr langs) - else do pgf_free_revision (a_db p) c_revision + else do pgf_free_revision_ (a_db p) c_revision return p - else do pgf_free_revision (a_db p) c_revision + else do pgf_free_revision_ (a_db p) c_revision return p else return p @@ -113,7 +112,7 @@ checkoutPGF p name = c_revision <- withPgfExn "checkoutPGF" (pgf_checkout_revision (a_db p) c_name) if c_revision == nullPtr then return Nothing - else do fptr <- C.newForeignPtr c_revision (pgf_free_revision (a_db p) c_revision) + else do fptr <- newForeignPtrEnv pgf_free_revision (a_db p) c_revision langs <- getConcretes (a_db p) fptr return (Just (PGF (a_db p) fptr langs))