summaryrefslogtreecommitdiff
path: root/libs/binder/IPCThreadState.cpp
diff options
context:
space:
mode:
author Elie Kheirallah <khei@google.com> 2022-04-21 23:46:17 +0000
committer Elie Kheirallah <khei@google.com> 2022-05-19 16:00:31 +0000
commit47431c12bc54ff9717f15228767d0f6d469fc786 (patch)
tree012eaacdea3e325d1f8802afbfbfb002485548a5 /libs/binder/IPCThreadState.cpp
parent7863bb5118f2289d59c205f621bb437a66740c4f (diff)
Tracking number of threads in threadpools.
Added tests for max total thread count. Renamed getThreadPoolMaxThreadCount to getThreadPoolMaxTotalThreadCount which takes into account user joined threads and polling threads. Test added to check that the current available threads update properly and do not lock. Added second test that simulates a deadlock and confirms the deadlock. Bug: 188834514 Test: binderLibTest Change-Id: Ia99d95544a38596ec9fc316e623e523b64337bc7
Diffstat (limited to 'libs/binder/IPCThreadState.cpp')
-rw-r--r--libs/binder/IPCThreadState.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index d453ac7532..d53621946a 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -638,7 +638,9 @@ void IPCThreadState::processPostWriteDerefs()
void IPCThreadState::joinThreadPool(bool isMain)
{
LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid());
-
+ pthread_mutex_lock(&mProcess->mThreadCountLock);
+ mProcess->mCurrentThreads++;
+ pthread_mutex_unlock(&mProcess->mThreadCountLock);
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
mIsLooper = true;
@@ -666,6 +668,13 @@ void IPCThreadState::joinThreadPool(bool isMain)
mOut.writeInt32(BC_EXIT_LOOPER);
mIsLooper = false;
talkWithDriver(false);
+ pthread_mutex_lock(&mProcess->mThreadCountLock);
+ LOG_ALWAYS_FATAL_IF(mProcess->mCurrentThreads == 0,
+ "Threadpool thread count = 0. Thread cannot exist and exit in empty "
+ "threadpool\n"
+ "Misconfiguration. Increase threadpool max threads configuration\n");
+ mProcess->mCurrentThreads--;
+ pthread_mutex_unlock(&mProcess->mThreadCountLock);
}
status_t IPCThreadState::setupPolling(int* fd)
@@ -677,6 +686,9 @@ status_t IPCThreadState::setupPolling(int* fd)
mOut.writeInt32(BC_ENTER_LOOPER);
flushCommands();
*fd = mProcess->mDriverFD;
+ pthread_mutex_lock(&mProcess->mThreadCountLock);
+ mProcess->mCurrentThreads++;
+ pthread_mutex_unlock(&mProcess->mThreadCountLock);
return 0;
}