1 //===-- IntelPTThreadTraceCollection.h ------------------------ -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef liblldb_IntelPTPerThreadTraceCollection_H_ 10 #define liblldb_IntelPTPerThreadTraceCollection_H_ 11 12 #include "IntelPTSingleBufferTrace.h" 13 #include <optional> 14 15 namespace lldb_private { 16 namespace process_linux { 17 18 /// Manages a list of thread traces. 19 class IntelPTThreadTraceCollection { 20 public: IntelPTThreadTraceCollection()21 IntelPTThreadTraceCollection() {} 22 23 /// Dispose of all traces 24 void Clear(); 25 26 /// \return 27 /// \b true if and only if this instance of tracing the provided \p tid. 28 bool TracesThread(lldb::tid_t tid) const; 29 30 /// \return 31 /// The total sum of the intel pt trace buffer sizes used by this 32 /// collection. 33 size_t GetTotalBufferSize() const; 34 35 /// Execute the provided callback on each thread that is being traced. 36 /// 37 /// \param[in] callback.tid 38 /// The id of the thread that is being traced. 39 /// 40 /// \param[in] callback.core_trace 41 /// The single-buffer trace instance for the given core. 42 void ForEachThread(std::function<void(lldb::tid_t tid, 43 IntelPTSingleBufferTrace &thread_trace)> 44 callback); 45 46 llvm::Expected<IntelPTSingleBufferTrace &> GetTracedThread(lldb::tid_t tid); 47 48 /// Start tracing the thread given by its \p tid. 49 /// 50 /// \return 51 /// An error if the operation failed. 52 llvm::Error TraceStart(lldb::tid_t tid, 53 const TraceIntelPTStartRequest &request); 54 55 /// Stop tracing the thread given by its \p tid. 56 /// 57 /// \return 58 /// An error if the given thread is not being traced or tracing couldn't be 59 /// stopped. 60 llvm::Error TraceStop(lldb::tid_t tid); 61 62 size_t GetTracedThreadsCount() const; 63 64 /// \copydoc IntelPTProcessTrace::TryGetBinaryData() 65 llvm::Expected<std::optional<std::vector<uint8_t>>> 66 TryGetBinaryData(const TraceGetBinaryDataRequest &request); 67 68 private: 69 llvm::DenseMap<lldb::tid_t, IntelPTSingleBufferTrace> m_thread_traces; 70 /// Total actual thread buffer size in bytes 71 size_t m_total_buffer_size = 0; 72 }; 73 74 } // namespace process_linux 75 } // namespace lldb_private 76 77 #endif // liblldb_IntelPTPerThreadTraceCollection_H_ 78