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

Commit 94673bd5 authored by Christine Tsai's avatar Christine Tsai Committed by Android (Google) Code Review
Browse files

Merge "Remove locks from StateManager to avoid race condition"

parents 983c3cc7 7192e0a8
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -29,18 +29,15 @@ StateManager& StateManager::getInstance() {
}

void StateManager::onLogEvent(const LogEvent& event) {
    std::lock_guard<std::mutex> lock(mMutex);
    if (mStateTrackers.find(event.GetTagId()) != mStateTrackers.end()) {
        mStateTrackers[event.GetTagId()]->onLogEvent(event);
    }
}

bool StateManager::registerListener(int32_t atomId, wp<StateListener> listener) {
    std::lock_guard<std::mutex> lock(mMutex);

    // Check if state tracker already exists
    // Check if state tracker already exists.
    if (mStateTrackers.find(atomId) == mStateTrackers.end()) {
        // Create a new state tracker iff atom is a state atom
        // Create a new state tracker iff atom is a state atom.
        auto it = android::util::AtomsInfo::kStateAtomsFieldOptions.find(atomId);
        if (it != android::util::AtomsInfo::kStateAtomsFieldOptions.end()) {
            mStateTrackers[atomId] = new StateTracker(atomId, it->second);
@@ -79,8 +76,6 @@ void StateManager::unregisterListener(int32_t atomId, wp<StateListener> listener

bool StateManager::getStateValue(int32_t atomId, const HashableDimensionKey& key,
                                 FieldValue* output) const {
    std::lock_guard<std::mutex> lock(mMutex);

    auto it = mStateTrackers.find(atomId);
    if (it != mStateTrackers.end()) {
        return it->second->getStateValue(key, output);
+7 −6
Original line number Diff line number Diff line
@@ -27,6 +27,10 @@ namespace android {
namespace os {
namespace statsd {

/**
 * This class is NOT thread safe.
 * It should only be used while StatsLogProcessor's lock is held.
 */
class StateManager : public virtual RefBase {
public:
    StateManager(){};
@@ -56,13 +60,10 @@ public:
                       FieldValue* output) const;

    inline int getStateTrackersCount() const {
        std::lock_guard<std::mutex> lock(mMutex);
        return mStateTrackers.size();
    }

    inline int getListenersCount(int32_t atomId) const {
        std::lock_guard<std::mutex> lock(mMutex);

        auto it = mStateTrackers.find(atomId);
        if (it != mStateTrackers.end()) {
            return it->second->getListenersCount();