summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2018-10-11 18:52:36 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-10-11 18:52:36 +0000
commit72c8a93bb710c6abcecd37233908dc9e57342e5f (patch)
tree4b87a2f3684729bc498392994a11831fd2f370c2
parent18ae8b92ce0df3d9764a1fdd38e1cf0cb0594f2f (diff)
parente97106a109a91698e744f78975a085e57c9ea720 (diff)
downloadnative-72c8a93bb710c6abcecd37233908dc9e57342e5f.tar.gz
Merge "libbinder_ndk: assert for known bad refcounting"
-rw-r--r--libs/binder/ndk/include_ndk/android/binder_auto_utils.h8
-rw-r--r--libs/binder/ndk/include_ndk/android/binder_interface_utils.h11
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