 8cad15b156
			
		
	
	
		8cad15b156
		
	
	
	
	
		
			
			Add simple transaction API to use in further update of block graph operations. Supposed usage is: - "prepare" is main function of the action and it should make the main effect of the action to be visible for the following actions, keeping possibility of roll-back, saving necessary things in action state, which is prepended to the action list (to do that, prepare func should call tran_add()). So, driver struct doesn't include "prepare" field, as it is supposed to be called directly. - commit/rollback is supposed to be called for the list of action states, to commit/rollback all the actions in reverse order - When possible "commit" should not make visible effect for other actions, which make possible transparent logical interaction between actions. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20210428151804.439460-9-vsementsov@virtuozzo.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Simple transactions API
 | |
|  *
 | |
|  * Copyright (c) 2021 Virtuozzo International GmbH.
 | |
|  *
 | |
|  * Author:
 | |
|  *  Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation; either version 2 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  *
 | |
|  * = Generic transaction API =
 | |
|  *
 | |
|  * The intended usage is the following: you create "prepare" functions, which
 | |
|  * represents the actions. They will usually have Transaction* argument, and
 | |
|  * call tran_add() to register finalization callbacks. For finalization
 | |
|  * callbacks, prepare corresponding TransactionActionDrv structures.
 | |
|  *
 | |
|  * Then, when you need to make a transaction, create an empty Transaction by
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #ifndef QEMU_TRANSACTIONS_H
 | |
| #define QEMU_TRANSACTIONS_H
 | |
| 
 | |
| #include <gmodule.h>
 | |
| 
 | |
| typedef struct TransactionActionDrv {
 | |
|     void (*abort)(void *opaque);
 | |
|     void (*commit)(void *opaque);
 | |
|     void (*clean)(void *opaque);
 | |
| } TransactionActionDrv;
 | |
| 
 | |
| typedef struct Transaction Transaction;
 | |
| 
 | |
| Transaction *tran_new(void);
 | |
| void tran_add(Transaction *tran, TransactionActionDrv *drv, void *opaque);
 | |
| void tran_abort(Transaction *tran);
 | |
| void tran_commit(Transaction *tran);
 | |
| 
 | |
| static inline void tran_finalize(Transaction *tran, int ret)
 | |
| {
 | |
|     if (ret < 0) {
 | |
|         tran_abort(tran);
 | |
|     } else {
 | |
|         tran_commit(tran);
 | |
|     }
 | |
| }
 | |
| 
 | |
| #endif /* QEMU_TRANSACTIONS_H */
 |