From fc09bc776b1a9b9ec918da72b5e173de4d3ff854 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Mon, 23 May 2022 19:50:41 +0200 Subject: [PATCH] transactions should always start with the last revision and release it when done --- src/runtime/c/pgf/namespace.h | 4 ++-- src/runtime/c/pgf/pgf.cxx | 7 ++++--- src/runtime/c/pgf/pgf.h | 3 +-- src/runtime/haskell/PGF2/FFI.hsc | 2 +- src/runtime/haskell/PGF2/Transactions.hsc | 2 +- src/runtime/haskell/tests/transactions.hs | 8 ++++---- src/runtime/javascript/ffi.ts | 2 +- src/runtime/python/transactions.c | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/runtime/c/pgf/namespace.h b/src/runtime/c/pgf/namespace.h index 28e007bae..4e3362968 100644 --- a/src/runtime/c/pgf/namespace.h +++ b/src/runtime/c/pgf/namespace.h @@ -260,7 +260,7 @@ public: return node->right; } else { ref left = pop_first(node->left, res); - ref node = upd_node(node, left, node->right); + node = upd_node(node, left, node->right); return balanceR(node); } } @@ -275,7 +275,7 @@ public: return node->left; } else { ref right = pop_last(node->right, res); - ref node = upd_node(node, node->left, right); + node = upd_node(node, node->left, right); return balanceL(node); } } diff --git a/src/runtime/c/pgf/pgf.cxx b/src/runtime/c/pgf/pgf.cxx index f93e2888d..a8877d567 100644 --- a/src/runtime/c/pgf/pgf.cxx +++ b/src/runtime/c/pgf/pgf.cxx @@ -1057,13 +1057,12 @@ void pgf_check_type(PgfDB *db, PgfRevision revision, } PGF_API -PgfRevision pgf_start_transaction(PgfDB *db, PgfRevision revision, - PgfExn *err) +PgfRevision pgf_start_transaction(PgfDB *db, PgfExn *err) { PGF_API_BEGIN { DB_scope scope(db, WRITER_SCOPE); - ref pgf = db->revision2pgf(revision); + ref pgf = db->get_active_revision(); db->start_transaction(); @@ -1079,6 +1078,8 @@ PgfRevision pgf_start_transaction(PgfDB *db, PgfRevision revision, object rev = db->register_revision(new_pgf.tagged(), PgfDB::get_txn_id()); + PgfDB::free(pgf); + db->ref_count++; return rev; } PGF_API_END diff --git a/src/runtime/c/pgf/pgf.h b/src/runtime/c/pgf/pgf.h index cd85b940c..aae3d0e8b 100644 --- a/src/runtime/c/pgf/pgf.h +++ b/src/runtime/c/pgf/pgf.h @@ -462,8 +462,7 @@ void pgf_check_type(PgfDB *db, PgfRevision revision, PgfExn *err); PGF_API_DECL -PgfRevision pgf_start_transaction(PgfDB *db, PgfRevision revision, - PgfExn *err); +PgfRevision pgf_start_transaction(PgfDB *db, PgfExn *err); PGF_API_DECL void pgf_commit_transaction(PgfDB *db, PgfRevision revision, diff --git a/src/runtime/haskell/PGF2/FFI.hsc b/src/runtime/haskell/PGF2/FFI.hsc index 8ae50cbcd..e0e6db673 100644 --- a/src/runtime/haskell/PGF2/FFI.hsc +++ b/src/runtime/haskell/PGF2/FFI.hsc @@ -175,7 +175,7 @@ foreign import ccall pgf_infer_expr :: Ptr PgfDB -> Ptr PGF -> Ptr (StablePtr Ex foreign import ccall pgf_check_type :: Ptr PgfDB -> Ptr PGF -> Ptr (StablePtr Type) -> Ptr PgfMarshaller -> Ptr PgfUnmarshaller -> Ptr PgfExn -> IO () -foreign import ccall pgf_start_transaction :: Ptr PgfDB -> Ptr PGF -> Ptr PgfExn -> IO (Ptr PGF) +foreign import ccall pgf_start_transaction :: Ptr PgfDB -> Ptr PgfExn -> IO (Ptr PGF) foreign import ccall pgf_commit_transaction :: Ptr PgfDB -> Ptr PGF -> Ptr PgfExn -> IO () diff --git a/src/runtime/haskell/PGF2/Transactions.hsc b/src/runtime/haskell/PGF2/Transactions.hsc index aafb5bd26..11e2a9d12 100644 --- a/src/runtime/haskell/PGF2/Transactions.hsc +++ b/src/runtime/haskell/PGF2/Transactions.hsc @@ -84,7 +84,7 @@ modifyPGF p (Transaction f) = withForeignPtr (a_revision p) $ \c_revision -> withPgfExn "modifyPGF" $ \c_exn -> mask $ \restore -> do - c_revision <- pgf_start_transaction (a_db p) c_revision c_exn + c_revision <- pgf_start_transaction (a_db p) c_exn ex_type <- (#peek PgfExn, type) c_exn if (ex_type :: (#type PgfExnType)) == (#const PGF_EXN_NONE) then do ((restore (f (a_db p) c_revision c_revision c_exn)) diff --git a/src/runtime/haskell/tests/transactions.hs b/src/runtime/haskell/tests/transactions.hs index 4e0a03954..800f1b104 100644 --- a/src/runtime/haskell/tests/transactions.hs +++ b/src/runtime/haskell/tests/transactions.hs @@ -9,10 +9,8 @@ main = do gr1 <- readPGF "tests/basic.pgf" let Just ty = readType "(N -> N) -> P (s z)" - print 1 gr2 <- modifyPGF gr1 (createFunction "foo" ty 0 [] pi >> createCategory "Q" [(Explicit,"x",ty)] pi) - print 2 gr4 <- checkoutPGF gr1 @@ -21,6 +19,7 @@ main = do gr7 <- modifyPGF gr1 $ createConcrete "basic_eng" $ do setConcreteFlag "test_flag" (LStr "test") + let Just cnc = Map.lookup "basic_eng" (languages gr7) c <- runTestTT $ @@ -31,8 +30,8 @@ main = do ,TestCase (assertEqual "original categories" ["Float","Int","N","P","S","String"] (categories gr1)) ,TestCase (assertEqual "extended categories" ["Float","Int","N","P","Q","S","String"] (categories gr2)) ,TestCase (assertEqual "Q context" (Just [(Explicit,"x",ty)]) (categoryContext gr2 "Q")) - ,TestCase (assertEqual "reduced functions" ["c","floatLit","intLit","nat","s","stringLit","z"] (functions gr6)) - ,TestCase (assertEqual "reduced categories" ["Float","Int","N","P","String"] (categories gr6)) + ,TestCase (assertEqual "reduced functions" ["c","floatLit","foo","intLit","nat","s","stringLit","z"] (functions gr6)) + ,TestCase (assertEqual "reduced categories" ["Float","Int","N","P","Q","String"] (categories gr6)) ,TestCase (assertEqual "old function type" Nothing (functionType gr1 "foo")) ,TestCase (assertEqual "new function type" (Just ty) (functionType gr2 "foo")) ,TestCase (assertEqual "old function prob" (-log 0) (functionProbability gr1 "foo")) @@ -49,3 +48,4 @@ main = do if (errors c == 0) && (failures c == 0) then exitSuccess else exitFailure + diff --git a/src/runtime/javascript/ffi.ts b/src/runtime/javascript/ffi.ts index 5e41f1bbc..b174b99df 100644 --- a/src/runtime/javascript/ffi.ts +++ b/src/runtime/javascript/ffi.ts @@ -129,7 +129,7 @@ export const runtime = ffi.Library('libpgf', { pgf_print_context: [PgfTextPtr, [size_t, PgfTypeHypoPtr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], pgf_read_type: [PgfType, [PgfTextPtr, PgfUnmarshallerPtr]], - pgf_start_transaction: [PgfRevision, [PgfDBPtr, PgfRevision, PgfExnPtr]], + pgf_start_transaction: [PgfRevision, [PgfDBPtr, PgfExnPtr]], pgf_commit_transaction: [ref.types.void, [PgfDBPtr, PgfRevision, PgfExnPtr]], pgf_rollback_transaction: [ref.types.void, [PgfDBPtr, PgfRevision]], pgf_checkout_revision: [PgfRevision, [PgfDBPtr, PgfExnPtr]], diff --git a/src/runtime/python/transactions.c b/src/runtime/python/transactions.c index 2690a9c0e..e983a03d5 100644 --- a/src/runtime/python/transactions.c +++ b/src/runtime/python/transactions.c @@ -40,7 +40,7 @@ PGF_newTransaction(PGFObject *self, PyObject *args) return NULL; PgfExn err; - PgfRevision rev = pgf_start_transaction(self->db, self->revision, &err); + PgfRevision rev = pgf_start_transaction(self->db, &err); if (handleError(err) != PGF_EXN_NONE) { return NULL; }