PMDK C++ bindings
1.12.1-rc1
This is the C++ bindings documentation for PMDK's libpmemobj.
|
C++ flat transaction handler class. More...
#include <libpmemobj++/transaction.hpp>
Public Types | |
using | manual = typename detail::transaction_base< true >::manual |
C++ manual scope transaction class. More... | |
using | automatic = typename detail::transaction_base< true >::automatic |
C++ automatic scope transaction class. More... | |
Public Types inherited from pmem::detail::transaction_base< true > | |
enum | stage |
Possible stages of a transaction, for every stage one or more callbacks can be registered. | |
Public Member Functions | |
~flat_transaction () noexcept=delete | |
Default destructor. | |
Public Member Functions inherited from pmem::detail::transaction_base< true > | |
~transaction_base () noexcept=delete | |
Default destructor. More... | |
Static Public Member Functions | |
template<typename... Locks> | |
static void | run (obj::pool_base &pool, std::function< void()> tx, Locks &... locks) |
Execute a closure-like transaction and lock locks . More... | |
Static Public Member Functions inherited from pmem::detail::transaction_base< true > | |
static void | abort (int err) |
Manually abort the current transaction. More... | |
static void | commit () |
Manually commit a transaction. More... | |
static void | run (obj::pool_base &pool, std::function< void()> tx, Locks &... locks) |
Execute a closure-like transaction and lock locks . More... | |
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... | |
C++ flat transaction handler class.
This class is recommended over basic_transaction.
This class is the pmemobj transaction handler. Scoped transactions are handled through two internal classes: manual and automatic.
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.
Unlike basic_transaction, flat_transaction does not abort automatically in case of transactional functions (like make_persistent) failures. Instead, abort will happen only if an exception is not caught before the outermost transaction ends.
The typical usage example would be:
using pmem::obj::flat_transaction::automatic = typename detail::transaction_base<true>::automatic |
C++ automatic scope transaction class.
This class is one of pmemobj transaction handlers. All operations between creating and destroying the transaction object are treated as performed in a transaction block and can be rolled back. If you have a C++17 compliant compiler, the automatic transaction will commit and abort automatically depending on the context of object destruction.
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.
The typical usage example would be:
using pmem::obj::flat_transaction::manual = typename detail::transaction_base<true>::manual |
C++ manual scope transaction class.
This class is one of pmemobj transaction handlers. All operations between creating and destroying the transaction object are treated as performed in a transaction block and can be rolled back. The manual transaction has to be committed explicitly in the outer most transaction - otherwise it will abort. Calling commit() in inner transactions is optional.
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.
The typical usage example would be:
|
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 propagated to the outer most transaction. If the exception is not caught, it will result in a transaction abort.
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.
[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. |
transaction_error | on any error pertaining the execution of the transaction. |
manual_tx_abort | on manual transaction abort. |