static void scan_and_mark(void const * area, size_t size, map2_type & m2, open_type & open) { unsigned char const * p = static_cast<unsigned char const *>(area); for(size_t n = 0; n + sizeof(shared_ptr_layout) <= size; p += pointer_align, n += pointer_align) { shared_ptr_layout const * q = reinterpret_cast<shared_ptr_layout const *>(p); if(q->pn.id == abt_boost::detail::shared_count_id && q->pn.pi != 0 && m2.count(q->pn.pi) != 0) { open.push_back(q->pn.pi); m2.erase(q->pn.pi); } } }
static void scan_and_free(void * area, size_t size, map2_type const & m2, free_list_type & free) { unsigned char * p = static_cast<unsigned char *>(area); for(size_t n = 0; n + sizeof(shared_ptr_layout) <= size; p += pointer_align, n += pointer_align) { shared_ptr_layout * q = reinterpret_cast<shared_ptr_layout *>(p); if(q->pn.id == abt_boost::detail::shared_count_id && q->pn.pi != 0 && m2.count(q->pn.pi) != 0 && q->px != 0) { abt_boost::shared_ptr<X> * ppx = reinterpret_cast< abt_boost::shared_ptr<X> * >(p); free.push_back(*ppx); ppx->reset(); } } }