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

Commit ec616bc9 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`
Change-Id: Ifa249050139e3683064a620f05d3f5ca645a739f
parent 29867fd4
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;