summaryrefslogtreecommitdiff
path: root/cmds/statsd/src/state/StateManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/statsd/src/state/StateManager.h')
-rw-r--r--cmds/statsd/src/state/StateManager.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/cmds/statsd/src/state/StateManager.h b/cmds/statsd/src/state/StateManager.h
new file mode 100644
index 000000000000..18c404c29c4e
--- /dev/null
+++ b/cmds/statsd/src/state/StateManager.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <inttypes.h>
+#include <utils/RefBase.h>
+
+#include <set>
+#include <string>
+#include <unordered_map>
+
+#include "HashableDimensionKey.h"
+#include "packages/UidMap.h"
+#include "state/StateListener.h"
+#include "state/StateTracker.h"
+
+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();
+
+ ~StateManager(){};
+
+ // Returns a pointer to the single, shared StateManager object.
+ static StateManager& getInstance();
+
+ // Unregisters all listeners and removes all trackers from StateManager.
+ void clear();
+
+ // Notifies the correct StateTracker of an event.
+ void onLogEvent(const LogEvent& event);
+
+ // Notifies the StateTracker for the given atomId to register listener.
+ // If the correct StateTracker does not exist, a new StateTracker is created.
+ // Note: StateTrackers can be created for non-state atoms. They are essentially empty and
+ // do not perform any actions.
+ void registerListener(const int32_t atomId, wp<StateListener> listener);
+
+ // Notifies the correct StateTracker to unregister a listener
+ // and removes the tracker if it no longer has any listeners.
+ void unregisterListener(const int32_t atomId, wp<StateListener> listener);
+
+ // Returns true if the StateTracker exists and queries for the
+ // original state value mapped to the given query key. The state value is
+ // stored and output in a FieldValue class.
+ // Returns false if the StateTracker doesn't exist.
+ bool getStateValue(const int32_t atomId, const HashableDimensionKey& queryKey,
+ FieldValue* output) const;
+
+ // Updates mAllowedLogSources with the latest uids for the packages that are allowed to log.
+ void updateLogSources(const sp<UidMap>& uidMap);
+
+ void notifyAppChanged(const string& apk, const sp<UidMap>& uidMap);
+
+ inline int getStateTrackersCount() const {
+ return mStateTrackers.size();
+ }
+
+ inline int getListenersCount(const int32_t atomId) const {
+ auto it = mStateTrackers.find(atomId);
+ if (it != mStateTrackers.end()) {
+ return it->second->getListenersCount();
+ }
+ return -1;
+ }
+
+private:
+ mutable std::mutex mMutex;
+
+ // Maps state atom ids to StateTrackers
+ std::unordered_map<int32_t, sp<StateTracker>> mStateTrackers;
+
+ // The package names that can log state events.
+ const std::set<std::string> mAllowedPkg;
+
+ // The combined uid sources (after translating pkg name to uid).
+ // State events from uids that are not in the list will be ignored to avoid state pollution.
+ std::set<int32_t> mAllowedLogSources;
+};
+
+} // namespace statsd
+} // namespace os
+} // namespace android