| /* | |
| * Copyright (C) 2025 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. | |
| */ | |
| #ifndef SRC_JAVA_SDK_MAIN_CPP_UTILS_H_ | |
| #define SRC_JAVA_SDK_MAIN_CPP_UTILS_H_ | |
| #include <string> | |
| #include <condition_variable> | |
| #include <cstdint> | |
| #include <memory> | |
| #include <mutex> | |
| #include <vector> | |
| #include "perfetto/public/abi/tracing_session_abi.h" | |
| // Copied from src/shared_lib/test/utils.h | |
| namespace perfetto { | |
| namespace java_sdk { | |
| namespace utils { | |
| class WaitableEvent { | |
| public: | |
| WaitableEvent() = default; | |
| void Notify() { | |
| std::unique_lock<std::mutex> lock(m_); | |
| notified_ = true; | |
| cv_.notify_one(); | |
| } | |
| bool WaitForNotification() { | |
| std::unique_lock<std::mutex> lock(m_); | |
| cv_.wait(lock, [this] { return notified_; }); | |
| return notified_; | |
| } | |
| bool IsNotified() { | |
| std::unique_lock<std::mutex> lock(m_); | |
| return notified_; | |
| } | |
| private: | |
| std::mutex m_; | |
| std::condition_variable cv_; | |
| bool notified_ = false; | |
| }; | |
| class TracingSession { | |
| public: | |
| class Builder { | |
| public: | |
| Builder() = default; | |
| Builder& set_data_source_name(std::string data_source_name) { | |
| data_source_name_ = std::move(data_source_name); | |
| return *this; | |
| } | |
| Builder& add_enabled_category(std::string category) { | |
| enabled_categories_.push_back(std::move(category)); | |
| return *this; | |
| } | |
| Builder& add_disabled_category(std::string category) { | |
| disabled_categories_.push_back(std::move(category)); | |
| return *this; | |
| } | |
| TracingSession Build(); | |
| private: | |
| std::string data_source_name_; | |
| std::vector<std::string> enabled_categories_; | |
| std::vector<std::string> disabled_categories_; | |
| }; | |
| static TracingSession Adopt(struct PerfettoTracingSessionImpl*); | |
| TracingSession(TracingSession&&) noexcept; | |
| ~TracingSession(); | |
| struct PerfettoTracingSessionImpl* session() const { return session_; } | |
| bool FlushBlocking(uint32_t timeout_ms); | |
| // Waits for the tracing session to be stopped. | |
| void WaitForStopped(); | |
| // Asks the tracing session to stop. Doesn't wait for it to be stopped. | |
| void StopAsync(); | |
| // Equivalent to StopAsync() + WaitForStopped(). | |
| void StopBlocking(); | |
| std::vector<uint8_t> ReadBlocking(); | |
| private: | |
| TracingSession() = default; | |
| struct PerfettoTracingSessionImpl* session_; | |
| std::unique_ptr<WaitableEvent> stopped_; | |
| }; | |
| } // namespace utils | |
| } // namespace java_sdk | |
| } // namespace perfetto | |
| #endif // SRC_JAVA_SDK_MAIN_CPP_UTILS_H_ |