xref: /openbmc/qemu/util/transactions.c (revision 079bff69)
18cad15b1SVladimir Sementsov-Ogievskiy /*
28cad15b1SVladimir Sementsov-Ogievskiy  * Simple transactions API
38cad15b1SVladimir Sementsov-Ogievskiy  *
48cad15b1SVladimir Sementsov-Ogievskiy  * Copyright (c) 2021 Virtuozzo International GmbH.
58cad15b1SVladimir Sementsov-Ogievskiy  *
68cad15b1SVladimir Sementsov-Ogievskiy  * Author:
78cad15b1SVladimir Sementsov-Ogievskiy  *  Sementsov-Ogievskiy Vladimir <vsementsov@virtuozzo.com>
88cad15b1SVladimir Sementsov-Ogievskiy  *
98cad15b1SVladimir Sementsov-Ogievskiy  * This program is free software; you can redistribute it and/or modify
108cad15b1SVladimir Sementsov-Ogievskiy  * it under the terms of the GNU General Public License as published by
118cad15b1SVladimir Sementsov-Ogievskiy  * the Free Software Foundation; either version 2 of the License, or
128cad15b1SVladimir Sementsov-Ogievskiy  * (at your option) any later version.
138cad15b1SVladimir Sementsov-Ogievskiy  *
148cad15b1SVladimir Sementsov-Ogievskiy  * This program is distributed in the hope that it will be useful,
158cad15b1SVladimir Sementsov-Ogievskiy  * but WITHOUT ANY WARRANTY; without even the implied warranty of
168cad15b1SVladimir Sementsov-Ogievskiy  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
178cad15b1SVladimir Sementsov-Ogievskiy  * GNU General Public License for more details.
188cad15b1SVladimir Sementsov-Ogievskiy  *
198cad15b1SVladimir Sementsov-Ogievskiy  * You should have received a copy of the GNU General Public License
208cad15b1SVladimir Sementsov-Ogievskiy  * along with this program. If not, see <http://www.gnu.org/licenses/>.
218cad15b1SVladimir Sementsov-Ogievskiy  */
228cad15b1SVladimir Sementsov-Ogievskiy 
238cad15b1SVladimir Sementsov-Ogievskiy #include "qemu/osdep.h"
248cad15b1SVladimir Sementsov-Ogievskiy 
258cad15b1SVladimir Sementsov-Ogievskiy #include "qemu/transactions.h"
268cad15b1SVladimir Sementsov-Ogievskiy #include "qemu/queue.h"
278cad15b1SVladimir Sementsov-Ogievskiy 
288cad15b1SVladimir Sementsov-Ogievskiy typedef struct TransactionAction {
298cad15b1SVladimir Sementsov-Ogievskiy     TransactionActionDrv *drv;
308cad15b1SVladimir Sementsov-Ogievskiy     void *opaque;
318cad15b1SVladimir Sementsov-Ogievskiy     QSLIST_ENTRY(TransactionAction) entry;
328cad15b1SVladimir Sementsov-Ogievskiy } TransactionAction;
338cad15b1SVladimir Sementsov-Ogievskiy 
348cad15b1SVladimir Sementsov-Ogievskiy struct Transaction {
358cad15b1SVladimir Sementsov-Ogievskiy     QSLIST_HEAD(, TransactionAction) actions;
368cad15b1SVladimir Sementsov-Ogievskiy };
378cad15b1SVladimir Sementsov-Ogievskiy 
tran_new(void)388cad15b1SVladimir Sementsov-Ogievskiy Transaction *tran_new(void)
398cad15b1SVladimir Sementsov-Ogievskiy {
408cad15b1SVladimir Sementsov-Ogievskiy     Transaction *tran = g_new(Transaction, 1);
418cad15b1SVladimir Sementsov-Ogievskiy 
428cad15b1SVladimir Sementsov-Ogievskiy     QSLIST_INIT(&tran->actions);
438cad15b1SVladimir Sementsov-Ogievskiy 
448cad15b1SVladimir Sementsov-Ogievskiy     return tran;
458cad15b1SVladimir Sementsov-Ogievskiy }
468cad15b1SVladimir Sementsov-Ogievskiy 
tran_add(Transaction * tran,TransactionActionDrv * drv,void * opaque)478cad15b1SVladimir Sementsov-Ogievskiy void tran_add(Transaction *tran, TransactionActionDrv *drv, void *opaque)
488cad15b1SVladimir Sementsov-Ogievskiy {
498cad15b1SVladimir Sementsov-Ogievskiy     TransactionAction *act;
508cad15b1SVladimir Sementsov-Ogievskiy 
518cad15b1SVladimir Sementsov-Ogievskiy     act = g_new(TransactionAction, 1);
528cad15b1SVladimir Sementsov-Ogievskiy     *act = (TransactionAction) {
538cad15b1SVladimir Sementsov-Ogievskiy         .drv = drv,
548cad15b1SVladimir Sementsov-Ogievskiy         .opaque = opaque
558cad15b1SVladimir Sementsov-Ogievskiy     };
568cad15b1SVladimir Sementsov-Ogievskiy 
578cad15b1SVladimir Sementsov-Ogievskiy     QSLIST_INSERT_HEAD(&tran->actions, act, entry);
588cad15b1SVladimir Sementsov-Ogievskiy }
598cad15b1SVladimir Sementsov-Ogievskiy 
tran_abort(Transaction * tran)608cad15b1SVladimir Sementsov-Ogievskiy void tran_abort(Transaction *tran)
618cad15b1SVladimir Sementsov-Ogievskiy {
628cad15b1SVladimir Sementsov-Ogievskiy     TransactionAction *act, *next;
638cad15b1SVladimir Sementsov-Ogievskiy 
64*079bff69SHanna Reitz     QSLIST_FOREACH(act, &tran->actions, entry) {
658cad15b1SVladimir Sementsov-Ogievskiy         if (act->drv->abort) {
668cad15b1SVladimir Sementsov-Ogievskiy             act->drv->abort(act->opaque);
678cad15b1SVladimir Sementsov-Ogievskiy         }
68*079bff69SHanna Reitz     }
698cad15b1SVladimir Sementsov-Ogievskiy 
70*079bff69SHanna Reitz     QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
718cad15b1SVladimir Sementsov-Ogievskiy         if (act->drv->clean) {
728cad15b1SVladimir Sementsov-Ogievskiy             act->drv->clean(act->opaque);
738cad15b1SVladimir Sementsov-Ogievskiy         }
748cad15b1SVladimir Sementsov-Ogievskiy 
758cad15b1SVladimir Sementsov-Ogievskiy         g_free(act);
768cad15b1SVladimir Sementsov-Ogievskiy     }
778cad15b1SVladimir Sementsov-Ogievskiy 
788cad15b1SVladimir Sementsov-Ogievskiy     g_free(tran);
798cad15b1SVladimir Sementsov-Ogievskiy }
808cad15b1SVladimir Sementsov-Ogievskiy 
tran_commit(Transaction * tran)818cad15b1SVladimir Sementsov-Ogievskiy void tran_commit(Transaction *tran)
828cad15b1SVladimir Sementsov-Ogievskiy {
838cad15b1SVladimir Sementsov-Ogievskiy     TransactionAction *act, *next;
848cad15b1SVladimir Sementsov-Ogievskiy 
85*079bff69SHanna Reitz     QSLIST_FOREACH(act, &tran->actions, entry) {
868cad15b1SVladimir Sementsov-Ogievskiy         if (act->drv->commit) {
878cad15b1SVladimir Sementsov-Ogievskiy             act->drv->commit(act->opaque);
888cad15b1SVladimir Sementsov-Ogievskiy         }
89*079bff69SHanna Reitz     }
908cad15b1SVladimir Sementsov-Ogievskiy 
91*079bff69SHanna Reitz     QSLIST_FOREACH_SAFE(act, &tran->actions, entry, next) {
928cad15b1SVladimir Sementsov-Ogievskiy         if (act->drv->clean) {
938cad15b1SVladimir Sementsov-Ogievskiy             act->drv->clean(act->opaque);
948cad15b1SVladimir Sementsov-Ogievskiy         }
958cad15b1SVladimir Sementsov-Ogievskiy 
968cad15b1SVladimir Sementsov-Ogievskiy         g_free(act);
978cad15b1SVladimir Sementsov-Ogievskiy     }
988cad15b1SVladimir Sementsov-Ogievskiy 
998cad15b1SVladimir Sementsov-Ogievskiy     g_free(tran);
1008cad15b1SVladimir Sementsov-Ogievskiy }
101