mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
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>
This commit is contained in:
parent
562bda8bb4
commit
079bff693b
2 changed files with 9 additions and 2 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue