From: Dave Watson Date: Tue, 9 Jan 2018 15:30:49 +0000 (-0800) Subject: Add a check if max atomic_shared_ptrs is reached. X-Git-Tag: v2018.01.15.00~38 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=6824c36bf128aa415a802b66e93a5019b8e16c25 Add a check if max atomic_shared_ptrs is reached. Summary: Batching reference counts reduces the maximum number of atomic_shared_ptrs available to the system (and also shared_ptrs). Add a check, test, and some comments about it. Reviewed By: yfeldblum Differential Revision: D5916291 fbshipit-source-id: 0bbf7b43284d94a304201219883c82b3654c1585 --- diff --git a/folly/concurrency/detail/AtomicSharedPtr-detail.h b/folly/concurrency/detail/AtomicSharedPtr-detail.h index 02d8be02..90d6835f 100644 --- a/folly/concurrency/detail/AtomicSharedPtr-detail.h +++ b/folly/concurrency/detail/AtomicSharedPtr-detail.h @@ -17,9 +17,19 @@ #include #include +#include + 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 @@ -42,6 +52,11 @@ class shared_ptr_internals { } 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); } diff --git a/folly/concurrency/test/AtomicSharedPtrTest.cpp b/folly/concurrency/test/AtomicSharedPtrTest.cpp index aa8c5434..410e743f 100644 --- a/folly/concurrency/test/AtomicSharedPtrTest.cpp +++ b/folly/concurrency/test/AtomicSharedPtrTest.cpp @@ -145,6 +145,17 @@ TEST(AtomicSharedPtr, AliasingConstructorTest) { EXPECT_EQ(2, d_count); } +TEST(AtomicSharedPtr, MaxPtrs) { + shared_ptr p(new long); + int max_atomic_shared_ptrs = 262144; + atomic_shared_ptr ptrs[max_atomic_shared_ptrs]; + for (int i = 0; i < max_atomic_shared_ptrs - 1; i++) { + ptrs[i].store(p); + } + atomic_shared_ptr fail; + EXPECT_DEATH(fail.store(p), ""); +} + TEST(AtomicSharedPtr, DeterministicTest) { DSched sched(DSched::uniform(FLAGS_seed));