summaryrefslogtreecommitdiff
path: root/libs/binder/IPCThreadState.cpp
diff options
context:
space:
mode:
author Jayant Chowdhary <jchowdhary@google.com> 2018-09-13 16:30:03 -0700
committer Jayant Chowdhary <jchowdhary@google.com> 2018-09-26 12:42:48 -0700
commit0397face57629e778b2bafe276afa0ca7479236b (patch)
tree1ade40c25cb1da4027f104729c8d35346ee70600 /libs/binder/IPCThreadState.cpp
parent48ac1c65a1b2f3bef128fd30d0e473c0d21c6eb5 (diff)
IPCThreadState: Add a public method to probe if a binder call is being served.
This can be useful when common code can be executed by both hwbinder and binder threads, and, they want to access (hardware::)IPCThreadState specific information. Eg: cameraserver. This commit adds a vndk private library 'libbinderthreadstate' which serves as common ground for both libbinder and libhwbinder to inform them about the nature of the IPC call being served (if at all) on the current thread. Bug: 110364143 Test: Boot device, use GCA Change-Id: Ifefb273c9a1f545417a82e9511a45bda00f701aa Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
Diffstat (limited to 'libs/binder/IPCThreadState.cpp')
-rw-r--r--libs/binder/IPCThreadState.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index b2217b5333..f052bcb982 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "IPCThreadState"
#include <binder/IPCThreadState.h>
+#include <binderthreadstate/IPCThreadStateBase.h>
#include <binder/Binder.h>
#include <binder/BpBinder.h>
@@ -742,6 +743,7 @@ IPCThreadState::IPCThreadState()
clearCaller();
mIn.setDataCapacity(256);
mOut.setDataCapacity(256);
+ mIPCThreadStateBase = IPCThreadStateBase::self();
}
IPCThreadState::~IPCThreadState()
@@ -1082,6 +1084,9 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
"Not enough command data for brTRANSACTION");
if (result != NO_ERROR) break;
+ //Record the fact that we're in a binder call.
+ mIPCThreadStateBase->pushCurrentState(
+ IPCThreadStateBase::CallState::BINDER);
Parcel buffer;
buffer.ipcSetDataReference(
reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
@@ -1129,6 +1134,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
error = the_context_object->transact(tr.code, buffer, &reply, tr.flags);
}
+ mIPCThreadStateBase->popCurrentState();
//ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
// mCallingPid, origPid, origUid);
@@ -1192,6 +1198,10 @@ status_t IPCThreadState::executeCommand(int32_t cmd)
return result;
}
+bool IPCThreadState::isServingCall() const {
+ return mIPCThreadStateBase->getCurrentBinderCallState() == IPCThreadStateBase::CallState::BINDER;
+}
+
void IPCThreadState::threadDestructor(void *st)
{
IPCThreadState* const self = static_cast<IPCThreadState*>(st);