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
This commit is contained in:
Vova Sharaienko
2023-07-24 23:19:34 +00:00
parent 0e3093b230
commit 03de4e4f1a
2 changed files with 29 additions and 2 deletions

View File

@@ -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

View File

@@ -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";