summaryrefslogtreecommitdiff
path: root/libs/hwui/FrameMetricsReporter.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/FrameMetricsReporter.h')
-rw-r--r--libs/hwui/FrameMetricsReporter.h30
1 files changed, 24 insertions, 6 deletions
diff --git a/libs/hwui/FrameMetricsReporter.h b/libs/hwui/FrameMetricsReporter.h
index 75b8038c5040..0643e790d00b 100644
--- a/libs/hwui/FrameMetricsReporter.h
+++ b/libs/hwui/FrameMetricsReporter.h
@@ -16,14 +16,16 @@
#pragma once
+#include <utils/Mutex.h>
#include <utils/Log.h>
#include <utils/RefBase.h>
+#include <ui/FatVector.h>
+
#include "FrameInfo.h"
#include "FrameMetricsObserver.h"
#include <string.h>
-#include <vector>
namespace android {
namespace uirenderer {
@@ -32,9 +34,13 @@ class FrameMetricsReporter {
public:
FrameMetricsReporter() {}
- void addObserver(FrameMetricsObserver* observer) { mObservers.push_back(observer); }
+ void addObserver(FrameMetricsObserver* observer) {
+ std::lock_guard lock(mObserversLock);
+ mObservers.push_back(observer);
+ }
bool removeObserver(FrameMetricsObserver* observer) {
+ std::lock_guard lock(mObserversLock);
for (size_t i = 0; i < mObservers.size(); i++) {
if (mObservers[i].get() == observer) {
mObservers.erase(mObservers.begin() + i);
@@ -44,16 +50,28 @@ public:
return false;
}
- bool hasObservers() { return mObservers.size() > 0; }
+ bool hasObservers() {
+ std::lock_guard lock(mObserversLock);
+ return mObservers.size() > 0;
+ }
void reportFrameMetrics(const int64_t* stats) {
- for (size_t i = 0; i < mObservers.size(); i++) {
- mObservers[i]->notify(stats);
+ FatVector<sp<FrameMetricsObserver>, 10> copy;
+ {
+ std::lock_guard lock(mObserversLock);
+ copy.reserve(mObservers.size());
+ for (size_t i = 0; i < mObservers.size(); i++) {
+ copy.push_back(mObservers[i]);
+ }
+ }
+ for (size_t i = 0; i < copy.size(); i++) {
+ copy[i]->notify(stats);
}
}
private:
- std::vector<sp<FrameMetricsObserver> > mObservers;
+ FatVector<sp<FrameMetricsObserver>, 10> mObservers GUARDED_BY(mObserversLock);
+ std::mutex mObserversLock;
};
} // namespace uirenderer