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

Commit 5a0f6c5b authored by Vova Sharaienko's avatar Vova Sharaienko
Browse files

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
parent adc6fe9a
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -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. */
@@ -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.
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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.
     */
@@ -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";