From 1aacc34deb95dee3aa67edae54086b9964970385 Mon Sep 17 00:00:00 2001 From: krangelov Date: Tue, 9 Nov 2021 08:02:20 +0100 Subject: [PATCH] fix reference counting for concrete revisions --- src/runtime/c/pgf/pgf.cxx | 4 ++-- src/runtime/haskell/PGF2/FFI.hsc | 2 ++ src/runtime/haskell/PGF2/Transactions.hsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/runtime/c/pgf/pgf.cxx b/src/runtime/c/pgf/pgf.cxx index 7c582b213..7d2471c02 100644 --- a/src/runtime/c/pgf/pgf.cxx +++ b/src/runtime/c/pgf/pgf.cxx @@ -873,7 +873,7 @@ PgfConcrRevision pgf_create_concrete(PgfDB *db, PgfRevision revision, throw pgf_error("The concrete syntax already exists"); concr = PgfDB::malloc(name->size+1); - concr->ref_count = 1; + concr->ref_count = 2; concr->ref_count_ex = 1; concr->cflags = 0; concr->lins = 0; @@ -912,7 +912,7 @@ PgfConcrRevision pgf_clone_concrete(PgfDB *db, PgfRevision revision, throw pgf_error("Unknown concrete syntax"); ref clone = PgfDB::malloc(name->size+1); - clone->ref_count = 1; + clone->ref_count = 2; clone->ref_count_ex = 1; clone->cflags = concr->cflags; clone->lins = concr->lins; diff --git a/src/runtime/haskell/PGF2/FFI.hsc b/src/runtime/haskell/PGF2/FFI.hsc index dc2665603..0644631ee 100644 --- a/src/runtime/haskell/PGF2/FFI.hsc +++ b/src/runtime/haskell/PGF2/FFI.hsc @@ -66,6 +66,8 @@ foreign import ccall "pgf_free_revision" pgf_free_revision_ :: Ptr PgfDB -> Ptr foreign import ccall "&pgf_free_revision" pgf_free_revision :: FinalizerEnvPtr PgfDB (PgfRevision PGF) +foreign import ccall "pgf_free_concr_revision" pgf_free_concr_revision_ :: Ptr PgfDB -> Ptr (PgfRevision Concr) -> IO () + foreign import ccall "&pgf_free_concr_revision" pgf_free_concr_revision :: FinalizerEnvPtr PgfDB (PgfRevision Concr) foreign import ccall "pgf_abstract_name" diff --git a/src/runtime/haskell/PGF2/Transactions.hsc b/src/runtime/haskell/PGF2/Transactions.hsc index bea93a4cf..08668475b 100644 --- a/src/runtime/haskell/PGF2/Transactions.hsc +++ b/src/runtime/haskell/PGF2/Transactions.hsc @@ -147,7 +147,8 @@ dropCategory name = Transaction $ \c_db c_revision c_exn -> createConcrete :: ConcName -> Transaction Concr () -> Transaction PGF () createConcrete name (Transaction f) = Transaction $ \c_db c_revision c_exn -> withText name $ \c_name -> do - c_concr_revision <- pgf_create_concrete c_db c_revision c_name c_exn + bracket (pgf_create_concrete c_db c_revision c_name c_exn) + (pgf_free_concr_revision_ c_db) $ \c_concr_revision -> f c_db c_concr_revision c_exn alterConcrete :: ConcName -> Transaction Concr () -> Transaction PGF ()