Loading libs/binder/IPCThreadState.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -1426,6 +1426,25 @@ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, bool *sync_received, bo return ret; } #ifndef __ANDROID_VNDK__ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, uint32_t *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; } #endif status_t IPCThreadState::freeze(pid_t pid, bool enable, uint32_t timeout_ms) { struct binder_freeze_info info; int ret = 0; Loading libs/binder/binder_module.h +2 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,8 @@ struct binder_frozen_status_info { // // Indicates whether the process has received any sync calls since last // freeze (cleared at freeze/unfreeze) // bit 0: received sync transaction after being frozen // bit 1: new pending sync transaction during freezing // __u32 sync_recv; // Loading libs/binder/include/binder/IPCThreadState.h +7 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,13 @@ public: // Provide information about the state of a frozen process static status_t getProcessFreezeInfo(pid_t pid, bool *sync_received, bool *async_received); // TODO: Remove the above legacy duplicated function in next version #ifndef __ANDROID_VNDK__ static status_t getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, uint32_t *async_received); #endif sp<ProcessState> process(); status_t clearLastError(); Loading libs/binder/tests/binderLibTest.cpp +21 −14 Original line number Diff line number Diff line Loading @@ -465,31 +465,30 @@ TEST_F(BinderLibTest, NopTransactionClear) { TEST_F(BinderLibTest, Freeze) { Parcel data, reply, replypid; std::ifstream freezer_file("/sys/fs/cgroup/freezer/cgroup.freeze"); std::ifstream freezer_file("/sys/fs/cgroup/uid_0/cgroup.freeze"); //Pass test on devices where the freezer is not supported // Pass test on devices where the cgroup v2 freezer is not supported if (freezer_file.fail()) { GTEST_SKIP(); return; } std::string freezer_enabled; std::getline(freezer_file, freezer_enabled); //Pass test on devices where the freezer is disabled if (freezer_enabled != "1") { GTEST_SKIP(); return; } EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR)); int32_t pid = replypid.readInt32(); for (int i = 0; i < 10; i++) { EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION_WAIT, data, &reply, TF_ONE_WAY)); } EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000)); // Pass test on devices where BINDER_FREEZE ioctl is not supported int ret = IPCThreadState::self()->freeze(pid, false, 0); if (ret != 0) { GTEST_SKIP(); return; } EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, true, 1000)); EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); bool sync_received, async_received; Loading @@ -500,6 +499,14 @@ TEST_F(BinderLibTest, Freeze) { EXPECT_EQ(sync_received, 1); EXPECT_EQ(async_received, 0); uint32_t sync_received2, async_received2; EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received2, &async_received2)); EXPECT_EQ(sync_received2, 1); EXPECT_EQ(async_received2, 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)); } Loading Loading
libs/binder/IPCThreadState.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -1426,6 +1426,25 @@ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, bool *sync_received, bo return ret; } #ifndef __ANDROID_VNDK__ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, uint32_t *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; } #endif status_t IPCThreadState::freeze(pid_t pid, bool enable, uint32_t timeout_ms) { struct binder_freeze_info info; int ret = 0; Loading
libs/binder/binder_module.h +2 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,8 @@ struct binder_frozen_status_info { // // Indicates whether the process has received any sync calls since last // freeze (cleared at freeze/unfreeze) // bit 0: received sync transaction after being frozen // bit 1: new pending sync transaction during freezing // __u32 sync_recv; // Loading
libs/binder/include/binder/IPCThreadState.h +7 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,13 @@ public: // Provide information about the state of a frozen process static status_t getProcessFreezeInfo(pid_t pid, bool *sync_received, bool *async_received); // TODO: Remove the above legacy duplicated function in next version #ifndef __ANDROID_VNDK__ static status_t getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, uint32_t *async_received); #endif sp<ProcessState> process(); status_t clearLastError(); Loading
libs/binder/tests/binderLibTest.cpp +21 −14 Original line number Diff line number Diff line Loading @@ -465,31 +465,30 @@ TEST_F(BinderLibTest, NopTransactionClear) { TEST_F(BinderLibTest, Freeze) { Parcel data, reply, replypid; std::ifstream freezer_file("/sys/fs/cgroup/freezer/cgroup.freeze"); std::ifstream freezer_file("/sys/fs/cgroup/uid_0/cgroup.freeze"); //Pass test on devices where the freezer is not supported // Pass test on devices where the cgroup v2 freezer is not supported if (freezer_file.fail()) { GTEST_SKIP(); return; } std::string freezer_enabled; std::getline(freezer_file, freezer_enabled); //Pass test on devices where the freezer is disabled if (freezer_enabled != "1") { GTEST_SKIP(); return; } EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR)); int32_t pid = replypid.readInt32(); for (int i = 0; i < 10; i++) { EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION_WAIT, data, &reply, TF_ONE_WAY)); } EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000)); // Pass test on devices where BINDER_FREEZE ioctl is not supported int ret = IPCThreadState::self()->freeze(pid, false, 0); if (ret != 0) { GTEST_SKIP(); return; } EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, true, 1000)); EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); bool sync_received, async_received; Loading @@ -500,6 +499,14 @@ TEST_F(BinderLibTest, Freeze) { EXPECT_EQ(sync_received, 1); EXPECT_EQ(async_received, 0); uint32_t sync_received2, async_received2; EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received2, &async_received2)); EXPECT_EQ(sync_received2, 1); EXPECT_EQ(async_received2, 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)); } Loading