diff options
| author | 2024-08-29 01:27:02 +0000 | |
|---|---|---|
| committer | 2024-08-29 01:27:02 +0000 | |
| commit | 4762c3deac6d2d0fd36dc6fb38cc39e3d509272f (patch) | |
| tree | 2dc9459ed638be72e3b50311f6c7adad6fcac246 | |
| parent | baca13fa73ab17c961d4068cb919353a779d0481 (diff) | |
| parent | 0186839fe0b15c0ce705ffba6a7bfbf5df627646 (diff) | |
Merge "Binder: avoid GC while holding lock" into main
| -rw-r--r-- | core/jni/android_util_Binder.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 2068bd7bc8ea..46b4695a9cec 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -466,10 +466,25 @@ class JavaBBinderHolder public: sp<JavaBBinder> get(JNIEnv* env, jobject obj) { - AutoMutex _l(mLock); - sp<JavaBBinder> b = mBinder.promote(); - if (b == NULL) { - b = new JavaBBinder(env, obj); + sp<JavaBBinder> b; + { + AutoMutex _l(mLock); + // must take lock to promote because we set the same wp<> + // on another thread. + b = mBinder.promote(); + } + + if (b) return b; + + // b/360067751: constructor may trigger GC, so call outside lock + b = new JavaBBinder(env, obj); + + { + AutoMutex _l(mLock); + // if it was constructed on another thread in the meantime, + // return that. 'b' will just get destructed. + if (sp<JavaBBinder> b2 = mBinder.promote(); b2) return b2; + if (mVintf) { ::android::internal::Stability::markVintf(b.get()); } |