Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2c4c721 authored by Li Li's avatar Li Li Committed by Gerrit Code Review
Browse files

Merge "getProcessFreezeInfo reads more info from kernel"

parents 152f0263 6f059293
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -1426,6 +1426,25 @@ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, bool *sync_received, bo
    return ret;
    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) {
status_t IPCThreadState::freeze(pid_t pid, bool enable, uint32_t timeout_ms) {
    struct binder_freeze_info info;
    struct binder_freeze_info info;
    int ret = 0;
    int ret = 0;
+2 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,8 @@ struct binder_frozen_status_info {
    //
    //
    // Indicates whether the process has received any sync calls since last
    // Indicates whether the process has received any sync calls since last
    // freeze (cleared at freeze/unfreeze)
    // freeze (cleared at freeze/unfreeze)
    // bit 0: received sync transaction after being frozen
    // bit 1: new pending sync transaction during freezing
    //
    //
    __u32 sync_recv;
    __u32 sync_recv;
    //
    //
+7 −0
Original line number Original line Diff line number Diff line
@@ -53,6 +53,13 @@ public:
    // Provide information about the state of a frozen process
    // Provide information about the state of a frozen process
    static  status_t            getProcessFreezeInfo(pid_t pid, bool *sync_received,
    static  status_t            getProcessFreezeInfo(pid_t pid, bool *sync_received,
                                                    bool *async_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();
            sp<ProcessState>    process();
            
            
            status_t            clearLastError();
            status_t            clearLastError();
+21 −14
Original line number Original line Diff line number Diff line
@@ -465,31 +465,30 @@ TEST_F(BinderLibTest, NopTransactionClear) {


TEST_F(BinderLibTest, Freeze) {
TEST_F(BinderLibTest, Freeze) {
    Parcel data, reply, replypid;
    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()) {
    if (freezer_file.fail()) {
        GTEST_SKIP();
        GTEST_SKIP();
        return;
        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));
    EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR));
    int32_t pid = replypid.readInt32();
    int32_t pid = replypid.readInt32();
    for (int i = 0; i < 10; i++) {
    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(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));
    // Pass test on devices where BINDER_FREEZE ioctl is not supported
    EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000));
    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));
    EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));


    bool sync_received, async_received;
    bool sync_received, async_received;
@@ -500,6 +499,14 @@ TEST_F(BinderLibTest, Freeze) {
    EXPECT_EQ(sync_received, 1);
    EXPECT_EQ(sync_received, 1);
    EXPECT_EQ(async_received, 0);
    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, IPCThreadState::self()->freeze(pid, 0, 0));
    EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
    EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
}
}