void intrusive_ptr_release(actor_control_block* x) { // release implicit weak pointer if the last strong ref expires // and destroy the data block if (x->strong_refs.fetch_sub(1, std::memory_order_acq_rel) == 1) { x->data_dtor(x->get()); intrusive_ptr_release_weak(x); } }
void reset(pointer new_value = nullptr, bool add_ref = true) { auto old = ptr_; set_ptr(new_value, add_ref); if (old) intrusive_ptr_release_weak(old); }
~weak_intrusive_ptr() { if (ptr_) intrusive_ptr_release_weak(ptr_); }