CNum 0.2.1
CPU-optimized ML library for C++
Loading...
Searching...
No Matches
HazardPointer.h
Go to the documentation of this file.
1#ifndef HAZARD_POINTER_H
2#define HAZARD_POINTER_H
3
4#include <atomic>
5#include <vector>
6#include <stdexcept>
7#include <functional>
8#include <unordered_set>
9
16 /// Add more as needed
17 constexpr size_t MAX_HP_SLOTS = 1024;
18
24 constexpr size_t SLOTS_PER_THREAD = 2;
25
28 constexpr size_t RETIRED_SCAN_THRESHOLD = 64;
29
32 * @brief A slot in which to store a protected pointer
33 */
34 struct HazardSlot {
35 ::std::atomic<void *> slot{ nullptr };
36 ::std::atomic<bool> active{ false };
37 };
38
41 * @brief A retired protected pointer
42 */
43 struct Retire {
44 void *ptr;
45 ::std::function< void(void *) > deleter;
46 };
47
49 inline thread_local ::std::vector<Retire> tls_retire;
50
55 class HazardPtrDomain {
56 private:
57 HazardSlot _global_slots[MAX_HP_SLOTS]{};
58
60 HazardPtrDomain();
61 public:
64 static HazardPtrDomain *get_domain();
65
71
76
80 void hazard_slots_gather(::std::vector<void *> &out);
81 };
82
88 private:
90 public:
95 HazardPtrGuard(const HazardPtrGuard &) = delete;
97
102
106 HazardSlot *get_slot(size_t idx);
107
112 void clear_slot(size_t idx);
113
116 };
117
118 template<typename T>
119 void default_hazard_ptr_delete(void *ptr);
120
121 template<typename T>
122 T *protect(::std::atomic<T *> &src, HazardSlot *slot);
123
124 template<typename T>
125 void protect(T *src, HazardSlot *slot);
126
127 template<typename T>
128 void retire(T *ptr);
129
136 void scan();
137
139 void flush();
140
141 #include "CNum/DataStructs/Memory/HazardPointer.tpp"
142};
143
144#endif
HazardSlot * acquire_hazard_slot()
Acquire ownership of a slot to protect a hazard pointer.
void release_hazard_slot(HazardSlot *slot)
Release ownership of a hazard pointer slot.
static HazardPtrDomain * get_domain()
Get a pointer to the instance of the HazardPtrDomain singleton.
void hazard_slots_gather(::std::vector< void * > &out)
Get all active hazard pointer slots.
HazardPtrGuard(const HazardPtrGuard &)=delete
void clear_slot(size_t idx)
Clear one of the guard's slots.
HazardSlot * get_slot(size_t idx)
Get a pointer to a guard's slot.
void clear_all_slots()
Clear all of the guard's slots.
HazardPtrGuard & operator=(const HazardPtrGuard &)=delete
Tools for protecting "hazerdous" objects in memory.
thread_local ::std::vector< Retire > tls_retire
The thread local storage of retired objects.
Definition HazardPointer.h:49
constexpr size_t RETIRED_SCAN_THRESHOLD
The threshold of Retire objects in the tls_retire at which we call scan().
Definition HazardPointer.h:28
constexpr size_t SLOTS_PER_THREAD
The amount of slots 1 thread can have.
Definition HazardPointer.h:24
void retire(T *ptr)
Retire a pointer.
Definition HazardPointer.h:41
void default_hazard_ptr_delete(void *ptr)
Default delete function for pointers.
Definition HazardPointer.h:5
constexpr size_t MAX_HP_SLOTS
The maximum amount of hazard pointer slots (globally) Add more as needed.
Definition HazardPointer.h:17
T * protect(::std::atomic< T * > &src, HazardSlot *slot)
Protect an atomic pointer.
Definition HazardPointer.h:16
void scan()
Free memory of objects pointed to by pointers that are no longer hazardous.
A slot in which to store a protected pointer.
Definition HazardPointer.h:34
::std::atomic< void * > slot
Definition HazardPointer.h:35
::std::atomic< bool > active
Definition HazardPointer.h:36
A retired protected pointer.
Definition HazardPointer.h:43
void * ptr
Definition HazardPointer.h:44
::std::function< void(void *) > deleter
Definition HazardPointer.h:45