diff options
author | 2024-12-13 20:03:37 +0000 | |
---|---|---|
committer | 2024-12-13 20:04:41 +0000 | |
commit | c86333d8d72947a0270fa45ef766af3aa5903ab7 (patch) | |
tree | 8a479a50eb8849e6bd5790704eed66a9df363af9 | |
parent | a92a88f6f481a904ede9a7a7685c028427aa8a79 (diff) |
libbinder: log when threads requested, not started
Few bugs about this over the years, so adding a log for
it.
Bug: 383234630
Test: no logs added on CF boot:
`adb logcat -d | grep "Thread pool configuration"`
Change-Id: I14382ee5d7e9cd56c245eb6d3883e7db14ff935b
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 1 | ||||
-rw-r--r-- | libs/binder/ProcessState.cpp | 15 | ||||
-rw-r--r-- | libs/binder/include/binder/ProcessState.h | 2 |
3 files changed, 18 insertions, 0 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 6698d0c0cd..623e7b9139 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -775,6 +775,7 @@ void IPCThreadState::joinThreadPool(bool isMain) { LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid()); + mProcess->checkExpectingThreadPoolStart(); mProcess->mCurrentThreads++; mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index 5e7f1510bc..0e1e9b4127 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -501,6 +501,21 @@ bool ProcessState::isThreadPoolStarted() const { return mThreadPoolStarted; } +void ProcessState::checkExpectingThreadPoolStart() const { + if (mThreadPoolStarted) return; + + // this is also racey, but you should setup the threadpool in the main thread. If that is an + // issue, we can check if we are the process leader, but haven't seen the issue in practice. + size_t requestedThreads = mMaxThreads.load(); + + // if it's manually set to the default, we do ignore it here... + if (requestedThreads == DEFAULT_MAX_BINDER_THREADS) return; + if (requestedThreads == 0) return; + + ALOGW("Thread pool configuration of size %zu requested, but startThreadPool was not called.", + requestedThreads); +} + #define DRIVER_FEATURES_PATH "/dev/binderfs/features/" bool ProcessState::isDriverFeatureEnabled(const DriverFeature feature) { // Use static variable to cache the results. diff --git a/libs/binder/include/binder/ProcessState.h b/libs/binder/include/binder/ProcessState.h index 21bfd42fcc..ced49c19c2 100644 --- a/libs/binder/include/binder/ProcessState.h +++ b/libs/binder/include/binder/ProcessState.h @@ -141,6 +141,8 @@ public: private: static sp<ProcessState> init(const char* defaultDriver, bool requireDefault); + void checkExpectingThreadPoolStart() const; + static void onFork(); static void parentPostFork(); static void childPostFork(); |