From b09fc4abb9627208efed3a69754a64775edb2403 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 11 Sep 2020 16:17:21 -0700 Subject: 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 --- libs/binder/IPCThreadState.cpp | 16 +++++++++++++++ libs/binder/include/binder/IPCThreadState.h | 3 +++ libs/binder/include/private/binder/binder_module.h | 23 ++++++++++++++++++++++ libs/binder/tests/binderLibTest.cpp | 9 +++++++++ 4 files changed, 51 insertions(+) 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 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)); } -- cgit v1.2.3-59-g8ed1b