diff options
author | Marco Ballesio <balejs@google.com> | 2020-09-09 16:35:13 -0700 |
---|---|---|
committer | Marco Ballesio <balejs@google.com> | 2020-09-11 16:14:12 -0700 |
commit | 3c21a5608428fc11589d8af5d59c3f9f418edafb (patch) | |
tree | 419b58a0f19e7609580fb76f8237d7e5ff56cbf3 | |
parent | ec3b36a49b0dc802a7dbdb15b2836c1afe6be98f (diff) | |
download | native-3c21a5608428fc11589d8af5d59c3f9f418edafb.tar.gz |
libbinder: adopt BINDER_GET_FROZEN_INFO
Introduce a new function to use BINDER_GET_FROZEN_INFO and related
tests.
Bug: 143717177
Test: atest testBinderLib
Change-Id: I8a6c550fadef90b73a36a7931c2a8b2d00a64a04
Merged-In: I8a6c550fadef90b73a36a7931c2a8b2d00a64a04
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 16 | ||||
-rw-r--r-- | libs/binder/include/binder/IPCThreadState.h | 4 | ||||
-rw-r--r-- | libs/binder/include/private/binder/binder_module.h | 23 | ||||
-rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 9 |
4 files changed, 52 insertions, 0 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 7d008e25ad..847b73ad71 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -1320,6 +1320,22 @@ void IPCThreadState::threadDestructor(void *st) } } +status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, bool *sync_received, bool *async_received) +{ + int ret = 0; + binder_frozen_status_info info; + info.pid = pid; + +#if defined(__ANDROID__) + if (ioctl(self()->mProcess->mDriverFD, BINDER_GET_FROZEN_INFO, &info) < 0) + ret = -errno; +#endif + *sync_received = info.sync_recv; + *async_received = info.async_recv; + + return ret; +} + status_t IPCThreadState::freeze(pid_t pid, bool enable, uint32_t timeout_ms) { struct binder_freeze_info info; int ret = 0; diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h index 7024f27cc7..8ac71659ba 100644 --- a/libs/binder/include/binder/IPCThreadState.h +++ b/libs/binder/include/binder/IPCThreadState.h @@ -50,6 +50,10 @@ public: __attribute__((weak)) static status_t freeze(pid_t pid, bool enabled, uint32_t timeout_ms); + // Provide information about the state of a frozen process + __attribute__((weak)) + static status_t getProcessFreezeInfo(pid_t pid, bool *sync_received, + bool *async_received); sp<ProcessState> process(); status_t clearLastError(); diff --git a/libs/binder/include/private/binder/binder_module.h b/libs/binder/include/private/binder/binder_module.h index 7898928f9f..7be8f7b2d9 100644 --- a/libs/binder/include/private/binder/binder_module.h +++ b/libs/binder/include/private/binder/binder_module.h @@ -66,6 +66,29 @@ struct binder_freeze_info { }; #endif //BINDER_FREEZE +#ifndef BINDER_GET_FROZEN_INFO + +#define BINDER_GET_FROZEN_INFO _IOWR('b', 15, struct binder_frozen_status_info) + +struct binder_frozen_status_info { + // + // Group-leader PID of process to be queried + // + __u32 pid; + // + // Indicates whether the process has received any sync calls since last + // freeze (cleared at freeze/unfreeze) + // + __u32 sync_recv; + // + // Indicates whether the process has received any async calls since last + // freeze (cleared at freeze/unfreeze) + // + __u32 async_recv; +}; +#endif //BINDER_GET_FROZEN_INFO + + #ifdef __cplusplus } // namespace android diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 145c09940b..98f0868bca 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -432,6 +432,15 @@ TEST_F(BinderLibTest, Freeze) { EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000)); EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); + + bool sync_received, async_received; + + EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received, + &async_received)); + + EXPECT_EQ(sync_received, 1); + EXPECT_EQ(async_received, 0); + EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 0, 0)); EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); } |