RESTRICT AUTOMERGE Make log reader thread a class member
pushedEventThread references class members after detaching. Making pushedEventThread as class member and joining in statsService destructor. Adding a method to stop readLogs thread. Ignore-AOSP-First: Bug is in still security triage and fuzzer is crashing on startup. Test: atest statsd_test Test: m statsd_service_fuzzer && adb sync data && adb shell /data/fuzz/arm64/statsd_service_fuzzer/statsd_service_fuzzer -runs=10000 Bug: 285645039 Change-Id: I1e886f9ccb7203714216da061c35e793b2a63d8a Merged-In: I1e886f9ccb7203714216da061c35e793b2a63d8a
This commit is contained in:
@@ -163,12 +163,15 @@ StatsService::StatsService(const sp<Looper>& handlerLooper, shared_ptr<LogEventQ
|
|||||||
init_system_properties();
|
init_system_properties();
|
||||||
|
|
||||||
if (mEventQueue != nullptr) {
|
if (mEventQueue != nullptr) {
|
||||||
std::thread pushedEventThread([this] { readLogs(); });
|
mLogsReaderThread = std::make_unique<std::thread>([this] { readLogs(); });
|
||||||
pushedEventThread.detach();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StatsService::~StatsService() {
|
StatsService::~StatsService() {
|
||||||
|
if (mEventQueue != nullptr) {
|
||||||
|
stopReadingLogs();
|
||||||
|
mLogsReaderThread->join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Runs on a dedicated thread to process pushed events. */
|
/* Runs on a dedicated thread to process pushed events. */
|
||||||
@@ -177,6 +180,13 @@ void StatsService::readLogs() {
|
|||||||
while (1) {
|
while (1) {
|
||||||
// Block until an event is available.
|
// Block until an event is available.
|
||||||
auto event = mEventQueue->waitPop();
|
auto event = mEventQueue->waitPop();
|
||||||
|
|
||||||
|
// Below flag will be set when statsd is exiting and log event will be pushed to break
|
||||||
|
// out of waitPop.
|
||||||
|
if (mIsStopRequested) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Pass it to StatsLogProcess to all configs/metrics
|
// Pass it to StatsLogProcess to all configs/metrics
|
||||||
// At this point, the LogEventQueue is not blocked, so that the socketListener
|
// At this point, the LogEventQueue is not blocked, so that the socketListener
|
||||||
// can read events from the socket and write to buffer to avoid data drop.
|
// can read events from the socket and write to buffer to avoid data drop.
|
||||||
@@ -1335,6 +1345,15 @@ void StatsService::statsCompanionServiceDiedImpl() {
|
|||||||
mPullerManager->SetStatsCompanionService(nullptr);
|
mPullerManager->SetStatsCompanionService(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StatsService::stopReadingLogs() {
|
||||||
|
mIsStopRequested = true;
|
||||||
|
// Push this event so that readLogs will process and break out of the loop
|
||||||
|
// after the stop is requested.
|
||||||
|
int64_t timeStamp;
|
||||||
|
std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
|
||||||
|
mEventQueue->push(std::move(logEvent), &timeStamp);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace statsd
|
} // namespace statsd
|
||||||
} // namespace os
|
} // namespace os
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
@@ -338,6 +338,13 @@ private:
|
|||||||
*/
|
*/
|
||||||
void statsCompanionServiceDiedImpl();
|
void statsCompanionServiceDiedImpl();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method is used to stop log reader thread.
|
||||||
|
*/
|
||||||
|
void stopReadingLogs();
|
||||||
|
|
||||||
|
std::atomic<bool> mIsStopRequested = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tracks the uid <--> package name mapping.
|
* Tracks the uid <--> package name mapping.
|
||||||
*/
|
*/
|
||||||
@@ -380,6 +387,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
mutable mutex mShellSubscriberMutex;
|
mutable mutex mShellSubscriberMutex;
|
||||||
std::shared_ptr<LogEventQueue> mEventQueue;
|
std::shared_ptr<LogEventQueue> mEventQueue;
|
||||||
|
std::unique_ptr<std::thread> mLogsReaderThread;
|
||||||
|
|
||||||
MultiConditionTrigger mBootCompleteTrigger;
|
MultiConditionTrigger mBootCompleteTrigger;
|
||||||
static const inline string kBootCompleteTag = "BOOT_COMPLETE";
|
static const inline string kBootCompleteTag = "BOOT_COMPLETE";
|
||||||
|
|||||||
Reference in New Issue
Block a user