1 //===-- SBTrace.cpp ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Utility/Log.h"
11 #include "lldb/Target/Process.h"
12 
13 #include "lldb/API/SBTrace.h"
14 #include "lldb/API/SBTraceOptions.h"
15 
16 using namespace lldb;
17 using namespace lldb_private;
18 
19 class TraceImpl {
20 public:
21   lldb::user_id_t uid;
22 };
23 
24 lldb::ProcessSP SBTrace::GetSP() const { return m_opaque_wp.lock(); }
25 
26 size_t SBTrace::GetTraceData(SBError &error, void *buf, size_t size,
27                              size_t offset, lldb::tid_t thread_id) {
28   size_t bytes_read = 0;
29   ProcessSP process_sp(GetSP());
30   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
31   error.Clear();
32 
33   if (!process_sp) {
34     error.SetErrorString("invalid process");
35   } else {
36     bytes_read = process_sp->GetData(GetTraceUID(), thread_id, error.ref(), buf,
37                                      size, offset);
38     LLDB_LOG(log, "SBTrace::bytes_read - %" PRIx64, bytes_read);
39   }
40   return bytes_read;
41 }
42 
43 size_t SBTrace::GetMetaData(SBError &error, void *buf, size_t size,
44                             size_t offset, lldb::tid_t thread_id) {
45   size_t bytes_read = 0;
46   ProcessSP process_sp(GetSP());
47   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
48   error.Clear();
49 
50   if (!process_sp) {
51     error.SetErrorString("invalid process");
52   } else {
53 
54     bytes_read = process_sp->GetMetaData(GetTraceUID(), thread_id, error.ref(),
55                                          buf, size, offset);
56     LLDB_LOG(log, "SBTrace::bytes_read - %" PRIx64, bytes_read);
57   }
58   return bytes_read;
59 }
60 
61 void SBTrace::StopTrace(SBError &error, lldb::tid_t thread_id) {
62   ProcessSP process_sp(GetSP());
63   error.Clear();
64 
65   if (!process_sp) {
66     error.SetErrorString("invalid process");
67     return;
68   }
69   process_sp->StopTrace(GetTraceUID(), thread_id, error.ref());
70 }
71 
72 void SBTrace::GetTraceConfig(SBTraceOptions &options, SBError &error) {
73   ProcessSP process_sp(GetSP());
74   error.Clear();
75 
76   if (!process_sp) {
77     error.SetErrorString("invalid process");
78   } else {
79     process_sp->GetTraceConfig(GetTraceUID(), error.ref(),
80                                options.m_traceoptions_sp);
81   }
82 }
83 
84 lldb::user_id_t SBTrace::GetTraceUID() {
85   if (m_trace_impl_sp)
86     return m_trace_impl_sp->uid;
87   return LLDB_INVALID_UID;
88 }
89 
90 void SBTrace::SetTraceUID(lldb::user_id_t uid) {
91   if (m_trace_impl_sp)
92     m_trace_impl_sp->uid = uid;
93 }
94 
95 SBTrace::SBTrace() {
96   m_trace_impl_sp.reset(new TraceImpl);
97   if (m_trace_impl_sp)
98     m_trace_impl_sp->uid = LLDB_INVALID_UID;
99 }
100 
101 void SBTrace::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
102 
103 bool SBTrace::IsValid() {
104   if (!m_trace_impl_sp)
105     return false;
106   if (!GetSP())
107     return false;
108   return true;
109 }
110