| // Copyright 2016 The Android Open Source Project |
| // |
| // This software is licensed under the terms of the GNU General Public |
| // License version 2, as published by the Free Software Foundation, and |
| // may be copied, distributed, and modified under those terms. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| #pragma once |
| |
| #include "android/base/synchronization/MessageChannel.h" |
| #include "android/base/threads/FunctorThread.h" |
| #include "android/metrics/MetricsReporter.h" |
| |
| namespace android { |
| namespace metrics { |
| |
| // |
| // AsyncMetricsReporter - an implementation of MetricsReporter that sends |
| // metrics messages asynchronously in a dedicated thread. |
| // |
| // Note: it is safe to have a separate worker thread that modified protobuf |
| // message object: this is actually the only thread that modifies it. We create |
| // an object in a worker thread, invoke the callback to fill its fields on the |
| // same thread, and pass it to the writer here as well. This means there are |
| // no multithreading issues to deal with. |
| // |
| |
| class AsyncMetricsReporter final : public MetricsReporter |
| { |
| public: |
| AsyncMetricsReporter(MetricsWriter::Ptr writer, |
| base::StringView emulatorVersion, |
| base::StringView emulatorFullVersion, |
| base::StringView qemuVersion); |
| ~AsyncMetricsReporter() override; |
| |
| void reportConditional(ConditionalCallback callback) override; |
| |
| private: |
| void worker(); |
| |
| android::base::FunctorThread mWorkerThread; |
| |
| // A message channel for the pending callbacks. Empty callback |
| // (ConditionalCallback{}) is a stop signal. |
| // Note: reserved size of 100 should be enough, if we ever get blocked on |
| // a full message channel then it's way too many messages being reported |
| // for a normal emulator state. |
| android::base::MessageChannel<ConditionalCallback, 100> mCallbackQueue; |
| }; |
| |
| } // namespace metrics |
| } // namespace android |