Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8df26e4 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Revert "Don't allow std::make_shared/unique for ndk::SharedRefBase objects"" into tm-dev

parents 93ccdae2 0bb0ce00
Loading
Loading
Loading
Loading
+0 −38
Original line number Diff line number Diff line
@@ -324,42 +324,4 @@ SpAIBinder BpCInterface<INTERFACE>::asBinder() {

}  // namespace ndk

// Once minSdkVersion is 30, we are guaranteed to be building with the
// Android 11 AIDL compiler which supports the SharedRefBase::make API.
#if !defined(__ANDROID_API__) || __ANDROID_API__ >= 30 || defined(__ANDROID_APEX__)
namespace ndk::internal {
template <typename T, typename = void>
struct is_complete_type : std::false_type {};

template <typename T>
struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
}  // namespace ndk::internal

namespace std {

// Define `SharedRefBase` specific versions of `std::make_shared` and
// `std::make_unique` to block people from using them. Using them to allocate
// `ndk::SharedRefBase` objects results in double ownership. Use
// `ndk::SharedRefBase::make<T>(...)` instead.
//
// Note: We exclude incomplete types because `std::is_base_of` is undefined in
// that case.

template <typename T, typename... Args,
          std::enable_if_t<ndk::internal::is_complete_type<T>::value, bool> = true,
          std::enable_if_t<std::is_base_of<ndk::SharedRefBase, T>::value, bool> = true>
shared_ptr<T> make_shared(Args...) {  // SEE COMMENT ABOVE.
    static_assert(!std::is_base_of<ndk::SharedRefBase, T>::value);
}

template <typename T, typename... Args,
          std::enable_if_t<ndk::internal::is_complete_type<T>::value, bool> = true,
          std::enable_if_t<std::is_base_of<ndk::SharedRefBase, T>::value, bool> = true>
unique_ptr<T> make_unique(Args...) {  // SEE COMMENT ABOVE.
    static_assert(!std::is_base_of<ndk::SharedRefBase, T>::value);
}

}  // namespace std
#endif

/** @} */
+2 −1
Original line number Diff line number Diff line
@@ -231,7 +231,8 @@ TEST(NdkBinder, DetectDoubleOwn) {
}

TEST(NdkBinder, DetectNoSharedRefBaseCreated) {
    EXPECT_DEATH(MyBinderNdkUnitTest(), "SharedRefBase: no ref created during lifetime");
    EXPECT_DEATH(std::make_shared<MyBinderNdkUnitTest>(),
                 "SharedRefBase: no ref created during lifetime");
}

TEST(NdkBinder, GetServiceThatDoesntExist) {