summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-09-18 23:05:38 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-09-18 23:05:38 +0000
commit4732904d5915901ce3ae4c6e5a81c3fac28f4bf2 (patch)
tree419b58a0f19e7609580fb76f8237d7e5ff56cbf3
parentfb1fbf5a43e30ffa7f385b494b488ed340b9d11c (diff)
parent3c21a5608428fc11589d8af5d59c3f9f418edafb (diff)
downloadnative-4732904d5915901ce3ae4c6e5a81c3fac28f4bf2.tar.gz
Snap for 6847696 from 3c21a5608428fc11589d8af5d59c3f9f418edafb to rvc-qpr1-release
Change-Id: Ib31f4267587a93af0e88679ea3dc6be032735998
-rw-r--r--libs/binder/IPCThreadState.cpp16
-rw-r--r--libs/binder/include/binder/IPCThreadState.h4
-rw-r--r--libs/binder/include/private/binder/binder_module.h23
-rw-r--r--libs/binder/tests/binderLibTest.cpp9
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));
}