diff options
author | Steven Moreland <smoreland@google.com> | 2018-10-11 18:52:36 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-10-11 18:52:36 +0000 |
commit | 72c8a93bb710c6abcecd37233908dc9e57342e5f (patch) | |
tree | 4b87a2f3684729bc498392994a11831fd2f370c2 | |
parent | 18ae8b92ce0df3d9764a1fdd38e1cf0cb0594f2f (diff) | |
parent | e97106a109a91698e744f78975a085e57c9ea720 (diff) | |
download | native-72c8a93bb710c6abcecd37233908dc9e57342e5f.tar.gz |
Merge "libbinder_ndk: assert for known bad refcounting"
-rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_auto_utils.h | 8 | ||||
-rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_interface_utils.h | 11 |
2 files changed, 17 insertions, 2 deletions
diff --git a/libs/binder/ndk/include_ndk/android/binder_auto_utils.h b/libs/binder/ndk/include_ndk/android/binder_auto_utils.h index d947e7b6ee..cc0a29d18a 100644 --- a/libs/binder/ndk/include_ndk/android/binder_auto_utils.h +++ b/libs/binder/ndk/include_ndk/android/binder_auto_utils.h @@ -30,6 +30,8 @@ #include <android/binder_parcel.h> #include <android/binder_status.h> +#include <assert.h> + #ifdef __cplusplus #include <cstddef> @@ -76,7 +78,11 @@ public: * Takes ownership of one strong refcount of binder */ void set(AIBinder* binder) { - if (mBinder != nullptr) AIBinder_decStrong(mBinder); + AIBinder* old = *const_cast<AIBinder* volatile*>(&mBinder); + if (old != nullptr) AIBinder_decStrong(old); + if (old != *const_cast<AIBinder* volatile*>(&mBinder)) { + __assert(__FILE__, __LINE__, "Race detected."); + } mBinder = binder; } diff --git a/libs/binder/ndk/include_ndk/android/binder_interface_utils.h b/libs/binder/ndk/include_ndk/android/binder_interface_utils.h index 5a4196a3f2..1a9018aea7 100644 --- a/libs/binder/ndk/include_ndk/android/binder_interface_utils.h +++ b/libs/binder/ndk/include_ndk/android/binder_interface_utils.h @@ -30,6 +30,8 @@ #include <android/binder_auto_utils.h> #include <android/binder_ibinder.h> +#include <assert.h> + #ifdef __cplusplus #include <memory> @@ -39,11 +41,18 @@ namespace ndk { /** * analog using std::shared_ptr for internally held refcount + * + * ref must be called at least one time during the lifetime of this object. The recommended way to construct + * this object is with SharedRefBase::make. */ class SharedRefBase { public: SharedRefBase() {} - virtual ~SharedRefBase() {} + virtual ~SharedRefBase() { + std::call_once(mFlagThis, [&]() { + __assert(__FILE__, __LINE__, "SharedRefBase: no ref created during lifetime"); + }); + } /** * A shared_ptr must be held to this object when this is called. This must be called once during |