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

Commit f67f2990 authored by Jeff Brown's avatar Jeff Brown
Browse files

Ensure input dispatcher and native looper handles EINTR.

Change-Id: I0a42db5f273b9bfe4ab174e4ee65d5d852f9f6bc
parent 3435d3bb
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -131,7 +131,10 @@ status_t InputChannel::openInputChannelPair(const String8& name,
}

status_t InputChannel::sendSignal(char signal) {
    ssize_t nWrite = ::write(mSendPipeFd, & signal, 1);
    ssize_t nWrite;
    do {
        nWrite = ::write(mSendPipeFd, & signal, 1);
    } while (nWrite == -1 && errno == EINTR);

    if (nWrite == 1) {
#if DEBUG_CHANNEL_SIGNALS
@@ -147,7 +150,11 @@ status_t InputChannel::sendSignal(char signal) {
}

status_t InputChannel::receiveSignal(char* outSignal) {
    ssize_t nRead = ::read(mReceivePipeFd, outSignal, 1);
    ssize_t nRead;
    do {
        nRead = ::read(mReceivePipeFd, outSignal, 1);
    } while (nRead == -1 && errno == EINTR);

    if (nRead == 1) {
#if DEBUG_CHANNEL_SIGNALS
        LOGD("channel '%s' ~ received signal '%c'", mName.string(), *outSignal);
+10 −4
Original line number Diff line number Diff line
@@ -162,9 +162,11 @@ int Looper::pollInner(int timeoutMillis) {
    struct epoll_event eventItems[EPOLL_MAX_EVENTS];
    int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);
    if (eventCount < 0) {
        if (errno != EINTR) {
            LOGW("Poll failed with an unexpected error, errno=%d", errno);
        if (errno == EINTR) {
            return ALOOPER_POLL_WAKE;
        }

        LOGW("Poll failed with an unexpected error, errno=%d", errno);
        return ALOOPER_POLL_ERROR;
    }

@@ -196,7 +198,7 @@ int Looper::pollInner(int timeoutMillis) {
                    ssize_t nRead;
                    do {
                        nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer));
                    } while (nRead == sizeof(buffer));
                    } while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer));
                } else {
                    LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
                }
@@ -272,7 +274,11 @@ void Looper::wake() {
    LOGD("%p ~ wake", this);
#endif

    ssize_t nWrite = write(mWakeWritePipeFd, "W", 1);
    ssize_t nWrite;
    do {
        nWrite = write(mWakeWritePipeFd, "W", 1);
    } while (nWrite == -1 && errno == EINTR);

    if (nWrite != 1) {
        if (errno != EAGAIN) {
            LOGW("Could not write wake signal, errno=%d", errno);