11188faa7SWalter Erquinigo //===-- IntelPTThreadTraceCollection.h ------------------------ -*- C++ -*-===//
21188faa7SWalter Erquinigo //
31188faa7SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41188faa7SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information.
51188faa7SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61188faa7SWalter Erquinigo //
71188faa7SWalter Erquinigo //===----------------------------------------------------------------------===//
81188faa7SWalter Erquinigo 
91188faa7SWalter Erquinigo #ifndef liblldb_IntelPTPerThreadTraceCollection_H_
101188faa7SWalter Erquinigo #define liblldb_IntelPTPerThreadTraceCollection_H_
111188faa7SWalter Erquinigo 
121188faa7SWalter Erquinigo #include "IntelPTSingleBufferTrace.h"
131188faa7SWalter Erquinigo 
141188faa7SWalter Erquinigo namespace lldb_private {
151188faa7SWalter Erquinigo namespace process_linux {
161188faa7SWalter Erquinigo 
171188faa7SWalter Erquinigo /// Manages a list of thread traces.
181188faa7SWalter Erquinigo class IntelPTThreadTraceCollection {
191188faa7SWalter Erquinigo public:
IntelPTThreadTraceCollection()201188faa7SWalter Erquinigo   IntelPTThreadTraceCollection() {}
211188faa7SWalter Erquinigo 
221188faa7SWalter Erquinigo   /// Dispose of all traces
231188faa7SWalter Erquinigo   void Clear();
241188faa7SWalter Erquinigo 
251188faa7SWalter Erquinigo   /// \return
261188faa7SWalter Erquinigo   ///   \b true if and only if this instance of tracing the provided \p tid.
271188faa7SWalter Erquinigo   bool TracesThread(lldb::tid_t tid) const;
281188faa7SWalter Erquinigo 
291188faa7SWalter Erquinigo   /// \return
30*6a5355e8SWalter Erquinigo   ///   The total sum of the intel pt trace buffer sizes used by this
31*6a5355e8SWalter Erquinigo   ///   collection.
321188faa7SWalter Erquinigo   size_t GetTotalBufferSize() const;
331188faa7SWalter Erquinigo 
341188faa7SWalter Erquinigo   /// Execute the provided callback on each thread that is being traced.
351188faa7SWalter Erquinigo   ///
361188faa7SWalter Erquinigo   /// \param[in] callback.tid
371188faa7SWalter Erquinigo   ///   The id of the thread that is being traced.
381188faa7SWalter Erquinigo   ///
391188faa7SWalter Erquinigo   /// \param[in] callback.core_trace
401188faa7SWalter Erquinigo   ///   The single-buffer trace instance for the given core.
411188faa7SWalter Erquinigo   void ForEachThread(std::function<void(lldb::tid_t tid,
421188faa7SWalter Erquinigo                                         IntelPTSingleBufferTrace &thread_trace)>
431188faa7SWalter Erquinigo                          callback);
441188faa7SWalter Erquinigo 
451188faa7SWalter Erquinigo   llvm::Expected<IntelPTSingleBufferTrace &> GetTracedThread(lldb::tid_t tid);
461188faa7SWalter Erquinigo 
471188faa7SWalter Erquinigo   /// Start tracing the thread given by its \p tid.
481188faa7SWalter Erquinigo   ///
491188faa7SWalter Erquinigo   /// \return
501188faa7SWalter Erquinigo   ///   An error if the operation failed.
511188faa7SWalter Erquinigo   llvm::Error TraceStart(lldb::tid_t tid,
521188faa7SWalter Erquinigo                          const TraceIntelPTStartRequest &request);
531188faa7SWalter Erquinigo 
541188faa7SWalter Erquinigo   /// Stop tracing the thread given by its \p tid.
551188faa7SWalter Erquinigo   ///
561188faa7SWalter Erquinigo   /// \return
571188faa7SWalter Erquinigo   ///   An error if the given thread is not being traced or tracing couldn't be
581188faa7SWalter Erquinigo   ///   stopped.
591188faa7SWalter Erquinigo   llvm::Error TraceStop(lldb::tid_t tid);
601188faa7SWalter Erquinigo 
611188faa7SWalter Erquinigo   size_t GetTracedThreadsCount() const;
621188faa7SWalter Erquinigo 
63fc5ef57cSWalter Erquinigo   /// \copydoc IntelPTProcessTrace::TryGetBinaryData()
64fc5ef57cSWalter Erquinigo   llvm::Expected<llvm::Optional<std::vector<uint8_t>>>
65fc5ef57cSWalter Erquinigo   TryGetBinaryData(const TraceGetBinaryDataRequest &request);
66fc5ef57cSWalter Erquinigo 
671188faa7SWalter Erquinigo private:
68a7582059SWalter Erquinigo   llvm::DenseMap<lldb::tid_t, IntelPTSingleBufferTrace> m_thread_traces;
691188faa7SWalter Erquinigo   /// Total actual thread buffer size in bytes
701188faa7SWalter Erquinigo   size_t m_total_buffer_size = 0;
711188faa7SWalter Erquinigo };
721188faa7SWalter Erquinigo 
731188faa7SWalter Erquinigo } // namespace process_linux
741188faa7SWalter Erquinigo } // namespace lldb_private
751188faa7SWalter Erquinigo 
761188faa7SWalter Erquinigo #endif // liblldb_IntelPTPerThreadTraceCollection_H_
77