diff options
author | 2018-09-13 16:30:03 -0700 | |
---|---|---|
committer | 2018-09-26 12:42:48 -0700 | |
commit | 0397face57629e778b2bafe276afa0ca7479236b (patch) | |
tree | 1ade40c25cb1da4027f104729c8d35346ee70600 /libs/binder/IPCThreadState.cpp | |
parent | 48ac1c65a1b2f3bef128fd30d0e473c0d21c6eb5 (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.cpp | 10 |
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); |