aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHanna Reitz <hreitz@redhat.com>2021-11-15 15:54:03 +0100
committerHanna Reitz <hreitz@redhat.com>2021-11-16 09:43:44 +0100
commit079bff693bc47bf69fb131f87a03c1689e48ed55 (patch)
tree91e2725472e54fb78a2b6f2c5831ccca1b885a54
parent562bda8bb41879eeda0bd484dd3d55134579b28e (diff)
downloadqemu-079bff693bc47bf69fb131f87a03c1689e48ed55.zip
qemu-079bff693bc47bf69fb131f87a03c1689e48ed55.tar.gz
qemu-079bff693bc47bf69fb131f87a03c1689e48ed55.tar.bz2
transactions: Invoke clean() after everything else
Invoke the transaction drivers' .clean() methods only after all .commit() or .abort() handlers are done. This makes it easier to have nested transactions where the top-level transactions pass objects to lower transactions that the latter can still use throughout their commit/abort phases, while the top-level transaction keeps a reference that is released in its .clean() method. (Before this commit, that is also possible, but the top-level transaction would need to take care to invoke tran_add() before the lower-level transaction does. This commit makes the ordering irrelevant, which is just a bit nicer.) Signed-off-by: Hanna Reitz <hreitz@redhat.com> Message-Id: <20211111120829.81329-8-hreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20211115145409.176785-8-kwolf@redhat.com> Signed-off-by: Hanna Reitz <hreitz@redhat.com>
-rw-r--r--include/qemu/transactions.h3
-rw-r--r--util/transactions.c8
2 files changed, 9 insertions, 2 deletions
diff --git a/include/qemu/transactions.h b/include/qemu/transactions.h
index 92c5965..2f2060a 100644
--- a/include/qemu/transactions.h
+++ b/include/qemu/transactions.h
@@ -31,6 +31,9 @@
* tran_create(), call your "prepare" functions on it, and finally call
* tran_abort() or tran_commit() to finalize the transaction by corresponding
* finalization actions in reverse order.
+ *
+ * The clean() functions registered by the drivers in a transaction are called
+ * last, after all abort() or commit() functions have been called.
*/
#ifndef QEMU_TRANSACTIONS_H
diff --git a/util/transactions.c b/util/transactions.c
index d0bc9a3..2dbdedc 100644
--- a/util/transactions.c
+++ b/util/transactions.c
@@ -61,11 +61,13 @@ void tran_abort(Transaction *tran)
{
TransactionAction *act, *next;
- QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
+ QSLIST_FOREACH(act, &tran->actions, entry) {
if (act->drv->abort) {
act->drv->abort(act->opaque);
}
+ }
+ QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
if (act->drv->clean) {
act->drv->clean(act->opaque);
}
@@ -80,11 +82,13 @@ void tran_commit(Transaction *tran)
{
TransactionAction *act, *next;
- QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
+ QSLIST_FOREACH(act, &tran->actions, entry) {
if (act->drv->commit) {
act->drv->commit(act->opaque);
}
+ }
+ QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
if (act->drv->clean) {
act->drv->clean(act->opaque);
}