50 mutable std::atomic<int> strong_users_ = 1;
57 mutable std::atomic<int> weak_users_ = 1;
63 mutable std::atomic<int64_t> version_ = 0;
75 return strong_users_.load(std::memory_order_relaxed) == 1;
84 return strong_users_.load(std::memory_order_acquire) == 0;
91 strong_users_.fetch_add(1, std::memory_order_relaxed);
104 weak_users_.fetch_add(1, std::memory_order_relaxed);
118 version_.fetch_add(1, std::memory_order_acq_rel);
127 return version_.load(std::memory_order_acquire);
132 return strong_users_.load(std::memory_order_acquire);
141 const int old_user_count = strong_users_.fetch_sub(1, std::memory_order_acq_rel);
143 const bool was_last_user = old_user_count == 1;
145 const int old_weak_user_count = weak_users_.load(std::memory_order_acquire);
147 if (old_weak_user_count == 1) {
170 const int old_weak_user_count = weak_users_.fetch_sub(1, std::memory_order_acq_rel);
172 const bool was_last_weak_user = old_weak_user_count == 1;
173 if (was_last_weak_user) {
183 virtual void delete_self_with_data() = 0;
185 virtual void delete_data_only() {}
195 void delete_self_with_data()
override
201 virtual void delete_self() = 0;
212 template<
typename... Args>
217#ifdef WITH_CXX_GUARDEDALLOC
218 MEM_CXX_CLASS_ALLOC_FUNCS(
"ImplicitSharedValue");
222 void delete_self_with_data()
override
233 const void *data =
nullptr;
236namespace implicit_sharing {
262 *r_dst_ptr = src_ptr;
263 *r_dst_sharing_info = src_sharing_info;
266 (*r_dst_sharing_info)->add_user();
277 (*sharing_info)->remove_user_and_delete_if_last();
280 *sharing_info =
nullptr;
297 *data =
static_cast<T *
>(
312 *data,
sizeof(T) * old_size,
sizeof(T) * new_size,
alignof(T), sharing_info));
Read Guarded memory(de)allocation.
ImplicitSharedValue(Args &&...args)
void remove_weak_user_and_delete_if_last() const
void tag_ensured_mutable() const
void add_weak_user() const
virtual ~ImplicitSharingInfo()
void remove_user_and_delete_if_last() const
void * resize_trivial_array_impl(void *old_data, int64_t old_size, int64_t new_size, int64_t alignment, const ImplicitSharingInfo **sharing_info)
void * make_trivial_data_mutable_impl(void *old_data, int64_t size, int64_t alignment, const ImplicitSharingInfo **sharing_info)
void resize_trivial_array(T **data, const ImplicitSharingInfo **sharing_info, int64_t old_size, int64_t new_size)
void copy_shared_pointer(T *src_ptr, const ImplicitSharingInfo *src_sharing_info, T **r_dst_ptr, const ImplicitSharingInfo **r_dst_sharing_info)
const ImplicitSharingInfo * info_for_mem_free(void *data)
void free_shared_data(T **data, const ImplicitSharingInfo **sharing_info)
void make_trivial_data_mutable(T **data, const ImplicitSharingInfo **sharing_info, const int64_t size)
const ImplicitSharingInfo * sharing_info