C++ transaction handler class.
More...
#include <libpmemobj++/transaction.hpp>
|
class | automatic |
| C++ automatic scope transaction class. More...
|
|
class | manual |
| C++ manual scope transaction class. More...
|
|
struct | tx_data |
| This data is stored along with the pmemobj transaction data using pmemobj_tx_set_data(). More...
|
|
|
enum | stage |
| Possible stages of a transaction, for every stage one or more callbacks can be registered.
|
|
|
static void | abort (int err) |
| Manually abort the current transaction. More...
|
|
static void | commit () |
| Manually commit a transaction. More...
|
|
template<typename... Locks> |
static void | run (pool_base &pool, std::function< void()> tx, Locks &... locks) |
| Execute a closure-like transaction and lock locks . More...
|
|
template<typename T , typename std::enable_if< LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T), T >::type * = nullptr> |
static void | snapshot (const T *addr, size_t num=1) |
| Takes a “snapshot” of given elements of type T number (1 by default), located at the given address ptr in the virtual memory space and saves it to the undo log. More...
|
|
static void | register_callback (stage stg, std::function< void()> cb) |
| Registers callback to be called on specified stage for the transaction. More...
|
|
|
template<typename L , typename... Locks> |
static int | add_lock (L &lock, Locks &... locks) noexcept |
| Recursively add locks to the active transaction. More...
|
|
static int | add_lock () noexcept |
| Method ending the recursive algorithm.
|
|
static void | c_callback (PMEMobjpool *pop, enum pobj_tx_stage obj_stage, void *arg) |
| C-style function which is passed as callback to pmemobj_begin. More...
|
|
static tx_data * | get_tx_data () |
| Gets tx user data from pmemobj or creates it if this is a first call to this function inside a transaction.
|
|
C++ transaction handler class.
This class is the pmemobj transaction handler. Scoped transactions are handled through two internal classes: manual and automatic.
- manual transactions need to be committed manually, otherwise they will be aborted on object destruction.
- automatic transactions are only available in C++17. They handle transaction commit/abort automatically.
This class also exposes a closure-like transaction API, which is the preferred way of handling transactions.
This API should NOT be mixed with C transactions API. One issue is that C++ callbacks registered using transaction::register_callback() would not be called if C++ transaction is created inside C transaction. The same is true if user calls pmemobj_tx_set_user_data() inside a C++ transaction.
The typical usage example would be:
void
general_tx_example()
{
struct root {
};
try {
pop,
[&]() {
proot->another_root = make_persistent<root>();
proot->count++;
},
proot->pmutex, proot->shared_pmutex);
} catch (...) {
}
}
◆ ~transaction()
pmem::obj::transaction::~transaction |
( |
| ) |
|
|
deletenoexcept |
Default destructor.
End pmemobj transaction. If the transaction has not been committed before object destruction, an abort will be issued.
◆ abort()
static void pmem::obj::transaction::abort |
( |
int |
err | ) |
|
|
inlinestatic |
Manually abort the current transaction.
If called within an inner transaction, the outer transactions will also be aborted.
- Parameters
-
[in] | err | the error to be reported as the reason of the abort. |
- Exceptions
-
◆ add_lock()
template<typename L , typename... Locks>
static int pmem::obj::transaction::add_lock |
( |
L & |
lock, |
|
|
Locks &... |
locks |
|
) |
| |
|
inlinestaticprivatenoexcept |
Recursively add locks to the active transaction.
The locks are taken in the provided order.
- Parameters
-
[in,out] | lock | the lock to add. |
[in,out] | locks | the rest of the locks to be added to the active transaction. |
- Returns
- error number if adding any of the locks failed, 0 otherwise.
◆ c_callback()
static void pmem::obj::transaction::c_callback |
( |
PMEMobjpool * |
pop, |
|
|
enum pobj_tx_stage |
obj_stage, |
|
|
void * |
arg |
|
) |
| |
|
inlinestaticprivate |
C-style function which is passed as callback to pmemobj_begin.
It executes previously registered callbacks for all stages.
◆ commit()
static void pmem::obj::transaction::commit |
( |
| ) |
|
|
inlinestatic |
Manually commit a transaction.
It is the sole responsibility of the caller, that after the call to transaction::commit() no other operations are done within the transaction.
- Exceptions
-
◆ register_callback()
static void pmem::obj::transaction::register_callback |
( |
stage |
stg, |
|
|
std::function< void()> |
cb |
|
) |
| |
|
inlinestatic |
Registers callback to be called on specified stage for the transaction.
In case of nested transactions those callbacks are called when the outer most transaction enters a specified stage.
- Precondition
- this function must be called during a transaction.
- Exceptions
-
The typical usage example would be:
void
tx_callback_example()
{
struct root {
};
bool cb_called = false;
auto internal_tx_function = [&] {
transaction::stage::oncommit,
[&] { cb_called = true; });
});
};
try {
} catch (...) {
}
}
◆ run()
template<typename... Locks>
static void pmem::obj::transaction::run |
( |
pool_base & |
pool, |
|
|
std::function< void()> |
tx, |
|
|
Locks &... |
locks |
|
) |
| |
|
inlinestatic |
Execute a closure-like transaction and lock locks
.
The locks have to be persistent memory resident locks. An attempt to lock the locks will be made. If any of the specified locks is already locked, the method will block. The locks are held until the end of the transaction. The transaction does not have to be committed manually. Manual aborts will end the transaction with an active exception.
If an exception is thrown within the transaction, it gets aborted and the exception is rethrown. Therefore extra care has to be taken with proper error handling.
The locks are held for the entire duration of the transaction. They are released at the end of the scope, so within the catch
block, they are already unlocked. If the cleanup action requires access to data within a critical section, the locks have to be manually acquired once again.
- Parameters
-
[in,out] | pool | the pool in which the transaction will take place. |
[in] | tx | an std::function<void ()> which will perform operations within this transaction. |
[in,out] | locks | locks to be taken for the duration of the transaction. |
- Exceptions
-
◆ snapshot()
template<typename T , typename std::enable_if< LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T), T >::type * = nullptr>
static void pmem::obj::transaction::snapshot |
( |
const T * |
addr, |
|
|
size_t |
num = 1 |
|
) |
| |
|
inlinestatic |
Takes a “snapshot” of given elements of type T number (1 by default), located at the given address ptr in the virtual memory space and saves it to the undo log.
The application is then free to directly modify the object in that memory range. In case of a failure or abort, all the changes within this range will be rolled back. The supplied block of memory has to be within the pool registered in the transaction. This function must be called during transaction. This overload only participates in overload resolution of function template if T satisfies requirements of LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE macro.
- Parameters
-
[in] | addr | pointer to the first object to be snapshotted. |
[in] | num | number of elements to be snapshotted. |
- Precondition
- this function must be called during transaction.
- Exceptions
-
transaction_error | when snapshotting failed or if function wasn't called during transaction. |
The documentation for this class was generated from the following file:
static void register_callback(stage stg, std::function< void()> cb)
Registers callback to be called on specified stage for the transaction.
Definition: transaction.hpp:557
static pool< T > create(const std::string &path, const std::string &layout, std::size_t size=PMEMOBJ_MIN_POOL, mode_t mode=DEFAULT_MODE)
Creates a new transactional object store pool.
Definition: pool.hpp:701
static void run(pool_base &pool, std::function< void()> tx, Locks &... locks)
Execute a closure-like transaction and lock locks.
Definition: transaction.hpp:422