Loading cmds/statsd/src/StatsService.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -163,12 +163,15 @@ StatsService::StatsService(const sp<Looper>& handlerLooper, shared_ptr<LogEventQ init_system_properties(); if (mEventQueue != nullptr) { std::thread pushedEventThread([this] { readLogs(); }); pushedEventThread.detach(); mLogsReaderThread = std::make_unique<std::thread>([this] { readLogs(); }); } } StatsService::~StatsService() { if (mEventQueue != nullptr) { stopReadingLogs(); mLogsReaderThread->join(); } } /* Runs on a dedicated thread to process pushed events. */ Loading @@ -177,6 +180,13 @@ void StatsService::readLogs() { while (1) { // Block until an event is available. 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 // 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. Loading Loading @@ -1335,6 +1345,15 @@ void StatsService::statsCompanionServiceDiedImpl() { 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 os } // namespace android cmds/statsd/src/StatsService.h +8 −0 Original line number Diff line number Diff line Loading @@ -338,6 +338,13 @@ private: */ void statsCompanionServiceDiedImpl(); /* * This method is used to stop log reader thread. */ void stopReadingLogs(); std::atomic<bool> mIsStopRequested = false; /** * Tracks the uid <--> package name mapping. */ Loading Loading @@ -380,6 +387,7 @@ private: */ mutable mutex mShellSubscriberMutex; std::shared_ptr<LogEventQueue> mEventQueue; std::unique_ptr<std::thread> mLogsReaderThread; MultiConditionTrigger mBootCompleteTrigger; static const inline string kBootCompleteTag = "BOOT_COMPLETE"; Loading Loading
cmds/statsd/src/StatsService.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -163,12 +163,15 @@ StatsService::StatsService(const sp<Looper>& handlerLooper, shared_ptr<LogEventQ init_system_properties(); if (mEventQueue != nullptr) { std::thread pushedEventThread([this] { readLogs(); }); pushedEventThread.detach(); mLogsReaderThread = std::make_unique<std::thread>([this] { readLogs(); }); } } StatsService::~StatsService() { if (mEventQueue != nullptr) { stopReadingLogs(); mLogsReaderThread->join(); } } /* Runs on a dedicated thread to process pushed events. */ Loading @@ -177,6 +180,13 @@ void StatsService::readLogs() { while (1) { // Block until an event is available. 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 // 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. Loading Loading @@ -1335,6 +1345,15 @@ void StatsService::statsCompanionServiceDiedImpl() { 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 os } // namespace android
cmds/statsd/src/StatsService.h +8 −0 Original line number Diff line number Diff line Loading @@ -338,6 +338,13 @@ private: */ void statsCompanionServiceDiedImpl(); /* * This method is used to stop log reader thread. */ void stopReadingLogs(); std::atomic<bool> mIsStopRequested = false; /** * Tracks the uid <--> package name mapping. */ Loading Loading @@ -380,6 +387,7 @@ private: */ mutable mutex mShellSubscriberMutex; std::shared_ptr<LogEventQueue> mEventQueue; std::unique_ptr<std::thread> mLogsReaderThread; MultiConditionTrigger mBootCompleteTrigger; static const inline string kBootCompleteTag = "BOOT_COMPLETE"; Loading