PMDK C++ bindings
1.9
This is the C++ bindings documentation for PMDK's libpmemobj.
|
Go to the documentation of this file.
38 #ifndef LIBPMEMOBJ_CPP_ENUMERABLE_THREAD_SPECIFIC_HPP
39 #define LIBPMEMOBJ_CPP_ENUMERABLE_THREAD_SPECIFIC_HPP
50 #include <shared_mutex>
52 #include <unordered_map>
75 static constexpr
size_t initial_queue_capacity = 1024;
78 std::size_t queue_capacity;
79 std::deque<size_t> queue;
121 using storage_type = Storage;
122 using mutex_type = Mutex;
126 using value_type = T;
127 using size_type =
typename storage_type::size_type;
128 using difference_type =
typename storage_type::difference_type;
129 using reference = value_type &;
130 using const_reference =
const value_type &;
131 using pointer = value_type *;
132 using const_pointer =
const value_type *;
133 using iterator =
typename storage_type::iterator;
134 using const_iterator =
typename storage_type::const_iterator;
137 template <
typename Handler>
138 void initialize(Handler handler = [](reference) {});
150 size_type
size()
const;
155 const_iterator
begin()
const;
156 const_iterator
end()
const;
165 storage_type _storage;
170 inline id_manager::id_manager()
171 : queue_capacity(initial_queue_capacity), queue(initial_queue_capacity, 0)
174 std::iota(queue.begin(), queue.end(), 0);
185 std::unique_lock<std::mutex> lock(mutex);
188 queue.push_front(queue_capacity++);
190 auto front = queue.front();
204 std::unique_lock<std::mutex> lock(mutex);
206 queue.push_front(
id);
232 #if LIBPMEMOBJ_CPP_VG_DRD_ENABLED
233 ANNOTATE_BENIGN_RACE_SIZED(
234 &manager,
sizeof(std::mutex),
235 "https://bugs.kde.org/show_bug.cgi?id=416286");
263 template <
typename T,
typename Mutex,
typename Storage>
266 _storage_size.get_rw() = 0;
272 template <
typename T,
typename Mutex,
typename Storage>
276 auto pop = get_pool();
279 #if LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED
280 VALGRIND_HG_DISABLE_CHECKING(&_storage_size,
sizeof(_storage_size));
283 #if LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED || LIBPMEMOBJ_CPP_VG_DRD_ENABLED
284 ANNOTATE_HAPPENS_BEFORE(&_storage_size);
287 _storage_size.get_rw().store(s);
288 pop.persist(_storage_size);
294 template <
typename T,
typename Mutex,
typename Storage>
298 auto s = _storage_size.get_ro().load();
300 #if LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED || LIBPMEMOBJ_CPP_VG_DRD_ENABLED
301 ANNOTATE_HAPPENS_AFTER(&_storage_size);
314 template <
typename T,
typename Mutex,
typename Storage>
315 template <
typename Handler>
319 for (reference e : *
this) {
333 template <
typename T,
typename Mutex,
typename Storage>
334 typename enumerable_thread_specific<T, Mutex, Storage>::reference
337 assert(pmemobj_tx_stage() != TX_STAGE_WORK);
340 auto index = tid.
get();
342 auto cached_size = get_cached_size();
344 if (index >= cached_size) {
345 std::unique_lock<mutex_type> lock(_mutex);
349 auto size = _storage.size();
352 _storage.resize(index + 1);
353 set_cached_size(index + 1);
354 }
else if (size != cached_size) {
355 set_cached_size(size);
364 return _storage[index];
373 template <
typename T,
typename Mutex,
typename Storage>
377 auto pop = get_pool();
380 _storage_size.get_rw() = 0;
390 template <
typename T,
typename Mutex,
typename Storage>
391 typename enumerable_thread_specific<T, Mutex, Storage>::size_type
394 return _storage.size();
402 template <
typename T,
typename Mutex,
typename Storage>
406 return _storage.size() == 0;
414 template <
typename T,
typename Mutex,
typename Storage>
415 typename enumerable_thread_specific<T, Mutex, Storage>::iterator
418 return _storage.begin();
426 template <
typename T,
typename Mutex,
typename Storage>
427 typename enumerable_thread_specific<T, Mutex, Storage>::iterator
430 return _storage.end();
438 template <
typename T,
typename Mutex,
typename Storage>
439 typename enumerable_thread_specific<T, Mutex, Storage>::const_iterator
442 return _storage.begin();
450 template <
typename T,
typename Mutex,
typename Storage>
451 typename enumerable_thread_specific<T, Mutex, Storage>::const_iterator
454 return _storage.end();
464 template <
typename T,
typename Mutex,
typename Storage>
468 auto pop = pmemobj_pool_by_ptr(
this);
469 assert(pop !=
nullptr);
Class for storing thread local data.
Definition: enumerable_thread_specific.hpp:120
Segment table is a data type with a vector-like interface The difference is that it does not do reall...
Definition: segment_vector.hpp:526
size_type size() const
Returns number of elements being stored in the container.
Definition: enumerable_thread_specific.hpp:392
size_t get()
Obtain current thread id.
Definition: enumerable_thread_specific.hpp:255
iterator end()
Returns an iterator to element after the last.
Definition: enumerable_thread_specific.hpp:428
Persistent memory namespace.
Definition: allocation_flag.hpp:43
size_t get()
Obtain unique thread id.
Definition: enumerable_thread_specific.hpp:183
obj::pool_base get_pool() const noexcept
Private helper function.
Definition: enumerable_thread_specific.hpp:466
static id_manager & get_id_manager()
Get reference to id_manager instance.
Definition: enumerable_thread_specific.hpp:213
Resides on pmem class.
Definition: p.hpp:64
This structure is used for assigning unique thread ids so that those ids will be reused in case of th...
Definition: enumerable_thread_specific.hpp:65
~thread_id_type()
thread_id_type destructor.
Definition: enumerable_thread_specific.hpp:246
static void run(pool_base &pool, std::function< void()> tx, Locks &... locks)
Execute a closure-like transaction and lock locks.
Definition: transaction.hpp:422
iterator begin()
Returns an iterator to the beginning.
Definition: enumerable_thread_specific.hpp:416
RAII-style structure for holding thread id.
Definition: enumerable_thread_specific.hpp:83
reference local()
Returns data reference for the current thread.
Definition: enumerable_thread_specific.hpp:335
void initialize(Handler handler=[](reference) {})
Initialization method.
Definition: enumerable_thread_specific.hpp:317
size_t get_cached_size()
Get cached storage size and make valgrind annotations.
Definition: enumerable_thread_specific.hpp:296
bool empty() const
Determines if container is empty or not.
Definition: enumerable_thread_specific.hpp:404
thread_id_type()
thread_id_type constructor.
Definition: enumerable_thread_specific.hpp:224
void clear()
Removes all elements from the container.
Definition: enumerable_thread_specific.hpp:375
enumerable_thread_specific()
Constructor.
Definition: enumerable_thread_specific.hpp:264
void set_cached_size(size_t s)
Set cached storage size, persist it and make valgrind annotations.
Definition: enumerable_thread_specific.hpp:274
The non-template pool base class.
Definition: pool.hpp:75
Persistent memory resident shared_mutex implementation.
Definition: shared_mutex.hpp:59
void release(size_t id)
Releases thread id so that it can be reused by other threads.
Definition: enumerable_thread_specific.hpp:202