transactions should always start with the last revision and release it when done

This commit is contained in:
Krasimir Angelov
2022-05-23 19:50:41 +02:00
parent d66cf23811
commit fc09bc776b
8 changed files with 15 additions and 15 deletions

View File

@@ -260,7 +260,7 @@ public:
return node->right;
} else {
ref<Node> left = pop_first(node->left, res);
ref<Node> 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<Node> right = pop_last(node->right, res);
ref<Node> node = upd_node(node, node->left, right);
node = upd_node(node, node->left, right);
return balanceL(node);
}
}

View File

@@ -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<PgfPGF> pgf = db->revision2pgf(revision);
ref<PgfPGF> 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

View File

@@ -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,

View File

@@ -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 ()

View File

@@ -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))

View File

@@ -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

View File

@@ -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]],

View File

@@ -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;
}