  Safe memory reclamation (SMR) schemes are an essential tool for lock-free
data structures and concurrent programming. However, manual SMR schemes are
notoriously difficult to apply correctly, and automatic schemes, such as
reference counting, have been argued for over a decade to be too slow for
practical purposes. A recent wave of work has disproved this long-held notion
and shown that reference counting can be as scalable as hazard pointers, one of
the most common manual techniques. Despite these tremendous improvements, there
remains a gap of up to 2x or more in performance between these schemes and
faster manual techniques such as epoch-based reclamation (EBR).
  In this work, we first advance these ideas and show that in many cases,
automatic reference counting can in fact be as fast as the fastest manual SMR
techniques. We generalize our previous Concurrent Deferred Reference Counting
(CDRC) algorithm to obtain a method for converting any standard manual SMR
technique into an automatic reference counting technique with a similar
performance profile. Our second contribution is extending this framework to
support weak pointers, which are reference-counted pointers that automatically
break pointer cycles by not contributing to the reference count, thus
addressing a common weakness in reference-counted garbage collection.
  Our experiments with a C++-library implementation show that our automatic
techniques perform in line with their manual counterparts, and that our weak
pointer implementation outperforms the best known atomic weak pointer library
by up to an order of magnitude on high thread counts. All together, we show
that the ease of use of automatic memory management can be achieved without
significant cost to practical performance or general applicability.
