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