9 #ifndef LIBPMEMOBJ_CPP_COMMON_HPP 10 #define LIBPMEMOBJ_CPP_COMMON_HPP 13 #include <libpmemobj/tx_base.h> 22 #if defined(__GNUC__) || defined(__clang__) 23 #define POBJ_CPP_DEPRECATED __attribute__((deprecated)) 24 #elif defined(_MSC_VER) 25 #define POBJ_CPP_DEPRECATED __declspec(deprecated) 27 #define POBJ_CPP_DEPRECATED 30 #if LIBPMEMOBJ_CPP_VG_ENABLED 31 #undef LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED 32 #undef LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED 33 #undef LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED 34 #undef LIBPMEMOBJ_CPP_VG_DRD_ENABLED 36 #define LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED 1 37 #define LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED 1 38 #define LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED 1 39 #define LIBPMEMOBJ_CPP_VG_DRD_ENABLED 1 42 #if LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED || \ 43 LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED || \ 44 LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED || LIBPMEMOBJ_CPP_VG_DRD_ENABLED 45 #define LIBPMEMOBJ_CPP_ANY_VG_TOOL_ENABLED 1 48 #if LIBPMEMOBJ_CPP_ANY_VG_TOOL_ENABLED 52 #if LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED 53 #include <pmemcheck.h> 56 #if LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED 60 #if LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED 64 #if LIBPMEMOBJ_CPP_VG_DRD_ENABLED 75 #if !defined(LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY) 76 #if !defined(__clang__) && defined(__GNUG__) && __GNUC__ < 5 77 #define LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY 1 79 #define LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY 0 83 #if LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY 84 #define LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T) 86 #define LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T) \ 87 std::is_trivially_copyable<T>::value 106 template <
typename T>
116 namespace experimental
142 template <
typename T>
144 conditional_add_to_tx(
const T *that, std::size_t count = 1, uint64_t flags = 0)
149 if (pmemobj_tx_stage() != TX_STAGE_WORK)
153 if (!pmemobj_pool_by_ptr(that))
156 if (pmemobj_tx_xadd_range_direct(that,
sizeof(*that) * count, flags)) {
159 "Could not add object(s) to the transaction.")
160 .with_pmemobj_errormsg();
163 "Could not add object(s) to the transaction.")
164 .with_pmemobj_errormsg();
171 template <
typename T>
175 return typeid(T).hash_code();
216 _BitScanReverse64(&j, x);
217 return static_cast<int>(j);
219 #elif __GNUC__ || __clang__ 224 return 8 * int(
sizeof(x)) - __builtin_clzll(x) - 1;
237 static const int table[64] = {
238 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, 61,
239 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, 62,
240 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, 56,
241 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5, 63};
243 return table[(x * 0x03f6eaf2cd271461) >> 58];
250 static inline uint8_t
251 mssb_index64(
unsigned long long value)
253 return ((uint8_t)(63 - __builtin_clzll(value)));
257 static inline uint8_t
258 mssb_index(
unsigned int value)
260 return ((uint8_t)(31 - __builtin_clz(value)));
265 static __inline uint8_t
266 mssb_index(
unsigned long value)
269 _BitScanReverse(&ret, value);
273 static __inline uint8_t
274 mssb_index64(uint64_t value)
277 _BitScanReverse64(&ret, value);
Persistent pointer class.
Definition: common.hpp:107
Custom transaction error class.
Definition: pexceptions.hpp:63
Custom out of memory error class.
Definition: pexceptions.hpp:119
Persistent memory namespace.
Definition: allocation_flag.hpp:14
uint64_t next_pow_2(uint32_t v)
Round up to the next lowest power of 2.
Definition: common.hpp:199