diff options
Diffstat (limited to 'libs/hwui/FrameMetricsReporter.h')
-rw-r--r-- | libs/hwui/FrameMetricsReporter.h | 30 |
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 |