#include template void do_delete(void* p) { delete static_cast(p); } struct data_to_reclaim { void* data; std::function deleter; data_to_reclaim* next; template data_to_reclaim(T* p) : data(p), deleter(&do_delete), next(0) { } ~data_to_reclaim() { deleter(data); } }; std::atomic nodes_to_reclaim; void add_to_reclaim_list(data_to_reclaim* node) { node->next = nodes_to_reclaim.load(); while (!nodes_to_reclaim.compare_exchange_weak(node->next, node)) ; } template void reclaim_later(T* data) { add_to_reclaim_list(new data_to_reclaim(data)); } void delete_nodes_with_no_hazards() { data_to_reclaim* current = nodes_to_reclaim.exchange(nullptr); while (current) { data_to_reclaim* const next = current->next; if (!outstanding_hazard_pointers_for(current->data)) { delete current; } else { add_to_reclaim_list(current); } current = next; } }