#include <atomic>
#include <memory>
+#include <folly/lang/SafeAssert.h>
+
namespace folly {
namespace detail {
+// This implementation is specific to libstdc++, now accepting
+// diffs for other libraries.
+
+// Specifically, this adds support for two things:
+// 1) incrementing/decrementing the shared count by more than 1 at a time
+// 2) Getting the thing the shared_ptr points to, which may be different from
+// the aliased pointer.
+
class shared_ptr_internals {
public:
template <typename T, typename... Args>
}
static void inc_shared_count(counted_base* base, long count) {
+ // Check that we don't exceed the maximum number of atomic_shared_ptrs.
+ // Consider setting EXTERNAL_COUNT lower if this CHECK is hit.
+ FOLLY_SAFE_CHECK(
+ base->_M_get_use_count() + count < INT_MAX,
+ "atomic_shared_ptr overflow");
__gnu_cxx::__atomic_add_dispatch(
&(base->*fieldPtr(access_use_count{})), count);
}
EXPECT_EQ(2, d_count);
}
+TEST(AtomicSharedPtr, MaxPtrs) {
+ shared_ptr<long> p(new long);
+ int max_atomic_shared_ptrs = 262144;
+ atomic_shared_ptr<long> ptrs[max_atomic_shared_ptrs];
+ for (int i = 0; i < max_atomic_shared_ptrs - 1; i++) {
+ ptrs[i].store(p);
+ }
+ atomic_shared_ptr<long> fail;
+ EXPECT_DEATH(fail.store(p), "");
+}
+
TEST(AtomicSharedPtr, DeterministicTest) {
DSched sched(DSched::uniform(FLAGS_seed));