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

Commit b09fc4ab authored by Marco Ballesio's avatar Marco Ballesio
Browse files

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
parent e51e48b0
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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();
+23 −0
Original line number Diff line number Diff line
@@ -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
+9 −0
Original line number Diff line number Diff line
@@ -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));
}