diff options
| author | 2020-09-17 15:54:46 +0000 | |
|---|---|---|
| committer | 2020-09-17 15:54:46 +0000 | |
| commit | 17990862ff0f711b33c5a7201832df5e66a6811b (patch) | |
| tree | 55ecc1107f66853db347c6b825d34f124dde7d76 | |
| parent | 52fac53c4e6cde22dbf5f2aafd4038d309d79453 (diff) | |
| parent | b09fc4abb9627208efed3a69754a64775edb2403 (diff) | |
Merge "libbinder: adopt BINDER_GET_FROZEN_INFO"
| -rw-r--r-- | libs/binder/IPCThreadState.cpp | 16 | ||||
| -rw-r--r-- | libs/binder/include/binder/IPCThreadState.h | 3 | ||||
| -rw-r--r-- | libs/binder/include/private/binder/binder_module.h | 23 | ||||
| -rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 9 |
4 files changed, 51 insertions, 0 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 0c71ed81a4..16afecdbb0 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 cdecceae4f..aa256d4a6b 100644 --- a/libs/binder/include/binder/IPCThreadState.h +++ b/libs/binder/include/binder/IPCThreadState.h @@ -49,6 +49,9 @@ public: // returns: 0 in case of success, a value < 0 in case of error static status_t freeze(pid_t pid, bool enabled, uint32_t timeout_ms); + // Provide information about the state of a frozen process + 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)); } |