Merge "Handling potential SIGPIPE signals."
This commit is contained in:
committed by
Android (Google) Code Review
commit
027a559172
@@ -407,7 +407,19 @@ WorkerThreadSection::WorkerThreadSection(int id, const int64_t timeoutMs, bool u
|
||||
|
||||
WorkerThreadSection::~WorkerThreadSection() {}
|
||||
|
||||
void sigpipe_handler(int signum) {
|
||||
if (signum == SIGPIPE) {
|
||||
ALOGE("Wrote to a broken pipe\n");
|
||||
} else {
|
||||
ALOGE("Received unexpected signal: %d\n", signum);
|
||||
}
|
||||
}
|
||||
|
||||
static void* worker_thread_func(void* cookie) {
|
||||
// Don't crash the service if we write to a closed pipe (which can happen if
|
||||
// dumping times out).
|
||||
signal(SIGPIPE, sigpipe_handler);
|
||||
|
||||
WorkerThreadData* data = (WorkerThreadData*)cookie;
|
||||
status_t err = data->section->BlockingCall(data->pipe.writeFd().get());
|
||||
|
||||
@@ -486,6 +498,7 @@ status_t WorkerThreadSection::Execute(ReportRequestSet* requests) const {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
write_section_stats(requests->sectionStats(this->id), buffer);
|
||||
if (timedOut || buffer.timedOut()) {
|
||||
ALOGW("[%s] timed out", this->name.string());
|
||||
@@ -773,7 +786,10 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
|
||||
}
|
||||
}
|
||||
gLastLogsRetrieved[mLogID] = lastTimestamp;
|
||||
proto.flush(pipeWriteFd);
|
||||
if (!proto.flush(pipeWriteFd) && errno == EPIPE) {
|
||||
ALOGE("[%s] wrote to a broken pipe\n", this->name.string());
|
||||
return EPIPE;
|
||||
}
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -875,7 +891,7 @@ status_t TombstoneSection::BlockingCall(int pipeWriteFd) const {
|
||||
break;
|
||||
}
|
||||
if (cStatus != NO_ERROR) {
|
||||
ALOGE("TombstoneSection '%s' child had an issue: %s\n", this->name.string(), strerror(-cStatus));
|
||||
ALOGE("[%s] child had an issue: %s\n", this->name.string(), strerror(-cStatus));
|
||||
}
|
||||
|
||||
auto dump = std::make_unique<char[]>(buffer.size());
|
||||
@@ -894,7 +910,13 @@ status_t TombstoneSection::BlockingCall(int pipeWriteFd) const {
|
||||
dumpPipe.readFd().reset();
|
||||
}
|
||||
|
||||
proto.flush(pipeWriteFd);
|
||||
if (!proto.flush(pipeWriteFd) && errno == EPIPE) {
|
||||
ALOGE("[%s] wrote to a broken pipe\n", this->name.string());
|
||||
if (err != NO_ERROR) {
|
||||
return EPIPE;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user