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

Commit 2dc6307e authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Fix a race conditon in `incident`." into rvc-dev am: 7b35bb38

Change-Id: Ifc25e6d878549cf372bc4b998fb55ad449f7571e
parents d5f0606d 7b35bb38
Loading
Loading
Loading
Loading
+17 −15
Original line number Original line Diff line number Diff line
@@ -52,9 +52,13 @@ public:
    virtual Status onReportServiceStatus(const String16& service, int32_t status);
    virtual Status onReportServiceStatus(const String16& service, int32_t status);
    virtual Status onReportFinished();
    virtual Status onReportFinished();
    virtual Status onReportFailed();
    virtual Status onReportFailed();

    int getExitCodeOrElse(int defaultCode);
 private:
    int mExitCode;
};
};


StatusListener::StatusListener()
StatusListener::StatusListener(): mExitCode(-1)
{
{
}
}


@@ -89,7 +93,7 @@ StatusListener::onReportFinished()
{
{
    fprintf(stderr, "done\n");
    fprintf(stderr, "done\n");
    ALOGD("done\n");
    ALOGD("done\n");
    exit(0);
    mExitCode = 0;
    return Status::ok();
    return Status::ok();
}
}


@@ -98,10 +102,15 @@ StatusListener::onReportFailed()
{
{
    fprintf(stderr, "failed\n");
    fprintf(stderr, "failed\n");
    ALOGD("failed\n");
    ALOGD("failed\n");
    exit(1);
    mExitCode = 1;
    return Status::ok();
    return Status::ok();
}
}


int
StatusListener::getExitCodeOrElse(int defaultCode) {
    return mExitCode == -1 ? defaultCode : mExitCode;
}

// ================================================================================
// ================================================================================
static void section_list(FILE* out) {
static void section_list(FILE* out) {
    IncidentSection sections[INCIDENT_SECTION_COUNT];
    IncidentSection sections[INCIDENT_SECTION_COUNT];
@@ -201,20 +210,13 @@ parse_receiver_arg(const string& arg, string* pkg, string* cls)
static int
static int
stream_output(const int read_fd, const int write_fd) {
stream_output(const int read_fd, const int write_fd) {
    while (true) {
    while (true) {
        uint8_t buf[4096];
        int amt = splice(read_fd, NULL, write_fd, NULL, 4096, 0);
        ssize_t amt = TEMP_FAILURE_RETRY(read(read_fd, buf, sizeof(buf)));
        if (amt < 0) {
        if (amt < 0) {
            break;
        } else if (amt == 0) {
            break;
        }

        ssize_t wamt = TEMP_FAILURE_RETRY(write(write_fd, buf, amt));
        if (wamt != amt) {
            return errno;
            return errno;
        } else if (amt == 0) {
            return 0;
        }
        }
    }
    }
    return 0;
}
}


// ================================================================================
// ================================================================================
@@ -384,7 +386,7 @@ main(int argc, char** argv)


        // Wait for the result and print out the data they send.
        // Wait for the result and print out the data they send.
        //IPCThreadState::self()->joinThreadPool();
        //IPCThreadState::self()->joinThreadPool();
        return stream_output(fds[0], STDOUT_FILENO);
        return listener->getExitCodeOrElse(stream_output(fds[0], STDOUT_FILENO));
    } else if (destination == DEST_DUMPSTATE) {
    } else if (destination == DEST_DUMPSTATE) {
        // Call into the service
        // Call into the service
        sp<StatusListener> listener(new StatusListener());
        sp<StatusListener> listener(new StatusListener());
@@ -393,7 +395,7 @@ main(int argc, char** argv)
            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
            fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string());
            return 1;
            return 1;
        }
        }
        return stream_output(fds[0], STDOUT_FILENO);
        return listener->getExitCodeOrElse(stream_output(fds[0], STDOUT_FILENO));
    } else {
    } else {
        status = service->reportIncident(args);
        status = service->reportIncident(args);
        if (!status.isOk()) {
        if (!status.isOk()) {