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

Commit 68b39240 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Always prefer poll over select.

Even with the fd leak fixed, we were still calling this code with fds
greater than 1024. From a tombstone from a dumpstate crash:

open files:
    fd 0: /dev/pts/0
...
    fd 18: /dev/stune/rt/tasks
    fd 1806: /data/anr/anr_2018-03-15-15-39-43-990
    fd 1807: /data/anr/anr_2018-03-15-15-39-43-991
    fd 1808: /data/anr/anr_2018-03-15-15-39-43-992
    fd 1809: /data/anr/anr_2018-03-15-15-39-43-993
    fd 1810: /data/anr/anr_2018-03-15-15-39-43-994
    fd 1811: /data/anr/anr_2018-03-15-15-39-43-995
    fd 1812: /data/anr/anr_2018-03-15-15-39-43-996
    fd 1813: /data/anr/anr_2018-03-15-15-39-43-997
    fd 1814: /data/anr/anr_2018-03-15-15-39-43-998
    fd 1815: /data/anr/anr_2018-03-15-15-39-43-999

Bug: http://b/73140330
Test: filled /data/anr/ with 2000 fake anrs, ran `dumpstate`

(cherry picked from commit ec616bc9)

Change-Id: Id3265e86fd987853e59261ae5f8e3bd03d618374
parent 152e3179
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include <errno.h>
#include <grp.h>
#include <poll.h>
#include <pwd.h>
#include <stdint.h>
#include <stdio.h>
@@ -35,6 +36,7 @@
#include <vector>

#include <android-base/file.h>
#include <android-base/macros.h>
#include <log/log.h>

uint64_t Nanotime() {
@@ -154,22 +156,16 @@ int DumpFileFromFdToFd(const std::string& title, const std::string& path_string,
        return 0;
    }
    bool newline = false;
    fd_set read_set;
    timeval tm;
    while (true) {
        FD_ZERO(&read_set);
        FD_SET(fd, &read_set);
        /* Timeout if no data is read for 30 seconds. */
        tm.tv_sec = 30;
        tm.tv_usec = 0;
        uint64_t elapsed = Nanotime();
        int ret = TEMP_FAILURE_RETRY(select(fd + 1, &read_set, nullptr, nullptr, &tm));
        uint64_t start_time = Nanotime();
        pollfd fds[] = { { .fd = fd, .events = POLLIN } };
        int ret = TEMP_FAILURE_RETRY(poll(fds, arraysize(fds), 30 * 1000));
        if (ret == -1) {
            dprintf(out_fd, "*** %s: select failed: %s\n", path, strerror(errno));
            dprintf(out_fd, "*** %s: poll failed: %s\n", path, strerror(errno));
            newline = true;
            break;
        } else if (ret == 0) {
            elapsed = Nanotime() - elapsed;
            uint64_t elapsed = Nanotime() - start_time;
            dprintf(out_fd, "*** %s: Timed out after %.3fs\n", path, (float)elapsed / NANOS_PER_SEC);
            newline = true;
            break;