|
18 | 18 | * There is a separate Feature describing and listing all |
19 | 19 | * experimental containers, see @ref experimental_containers. |
20 | 20 | * |
21 | | - * # Rationale for implementing pmem-aware containers |
| 21 | + * ## Rationale for implementing pmem-aware containers |
22 | 22 | * |
23 | 23 | * The C++ standard library containers collection is something that persistent |
24 | 24 | * memory programmers may want to use. Containers manage the lifetime of held |
|
43 | 43 | * internal implementation details, libpmemobj-cpp persistent memory containers |
44 | 44 | * have the well-known STL-like interface and they work with STL algorithms. |
45 | 45 | * |
46 | | - * # Additional resources |
| 46 | + * ## Additional resources |
47 | 47 | * - [Blog post on pmem.io about libpmemobj-cpp persistent containers](https://pmem.io/2018/11/20/cpp-persistent-containers.html) |
48 | 48 | * - [A blog post about array container](https://pmem.io/2018/11/02/cpp-array.html) |
49 | 49 | * - [Very first description of (then yet experimental) vector container](https://pmem.io/2019/02/20/cpp-vector.html) |
|
73 | 73 | /** @defgroup transactions Transactions |
74 | 74 | * Transactional approach to store data on pmem. |
75 | 75 | * |
76 | | - * # General info about transactions |
| 76 | + * ## General info about transactions |
77 | 77 | * |
78 | 78 | * The heart of the libpmemobj are transactions. A transaction is defined as series of operations on |
79 | 79 | * **persistent memory objects** that either all occur, or nothing occurs. In particular, if the execution |
|
122 | 122 | * If you want to read more and see example usages of both, you have to see |
123 | 123 | * flat or basic transaction documentation, because each implementation may differ. |
124 | 124 | * |
125 | | - * # Lifecycle and stages: |
| 125 | + * ## Lifecycle and stages: |
126 | 126 | * |
127 | 127 | * When you are using transaction API a transaction can be in one of the following states: |
128 | 128 | * - *TX_STAGE_NONE* - no open transaction in this thread |
|
142 | 142 | * |
143 | 143 | * If you need to read general information about transaction move to the *Additional resources* section. |
144 | 144 | * |
145 | | - * # Example of flat_transaction |
| 145 | + * ## Example of flat_transaction |
146 | 146 | * For comparison with the previous snippet, here is a code snippet of |
147 | 147 | * @ref pmem::obj::flat_transaction which is listed below with basic explanation inline. |
148 | 148 | * @snippet transaction/transaction.cpp tx_nested_struct_example |
|
151 | 151 | * For more examples please look at the |
152 | 152 | * [examples directory](https://github.com/pmem/libpmemobj-cpp/tree/master/examples) in libpmemobj-cpp repository. |
153 | 153 | * |
154 | | - * # Additional resources |
| 154 | + * ## Additional resources |
155 | 155 | * - [pmemobj_tx_begin(3) manpage with transaction description (C API)](https://pmem.io/pmdk/manpages/linux/master/libpmemobj/pmemobj_tx_begin.3) |
156 | 156 | * - [blog post about transactions](https://pmem.io/2016/05/25/cpp-07.html) |
157 | 157 | * - [blog post about transactional allocations](https://pmem.io/2016/05/19/cpp-06.html) |
|
202 | 202 | * |
203 | 203 | * It's worth noticing that pmem locks are automatically released on recovery or when crash happened. |
204 | 204 | * |
205 | | - * # Additional resources |
| 205 | + * ## Additional resources |
206 | 206 | * - [Libpmemobj-cpp - lessons learned](https://pmem.io/blog/2021/09/libpmemobj-cpp-lessons-learned) |
207 | 207 | * In this blog post we explain, i.a., why keeping locks on pmem is not a good idea. |
208 | 208 | */ |
|
0 commit comments