blob: a8063bfb34d799de1c9a84df344e20224c91e565 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Event.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// C Includes
11// C++ Includes
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000012#include <algorithm>
13
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014// Other libraries and framework includes
15// Project includes
16#include "lldb/Core/Event.h"
17#include "lldb/Core/Broadcaster.h"
18#include "lldb/Core/DataExtractor.h"
19#include "lldb/Core/Log.h"
20#include "lldb/Core/State.h"
21#include "lldb/Core/Stream.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000022#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
25using namespace lldb;
26using namespace lldb_private;
27
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) :
Jim Ingham583bbb12016-03-07 21:50:25 +000029 m_broadcaster_wp (broadcaster->GetBroadcasterImpl()),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030 m_type (event_type),
31 m_data_ap (data)
32{
33}
34
35Event::Event(uint32_t event_type, EventData *data) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036 m_type (event_type),
37 m_data_ap (data)
38{
39}
40
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000041Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042
43void
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044Event::Dump (Stream *s) const
45{
Jim Ingham583bbb12016-03-07 21:50:25 +000046 Broadcaster *broadcaster;
47 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
48 if (broadcaster_impl_sp)
49 broadcaster = broadcaster_impl_sp->GetBroadcaster();
50 else
51 broadcaster = nullptr;
52
53 if (broadcaster)
Greg Clayton6a3efac2012-10-29 18:08:18 +000054 {
55 StreamString event_name;
Jim Ingham583bbb12016-03-07 21:50:25 +000056 if (broadcaster->GetEventNames (event_name, m_type, false))
Greg Clayton6a3efac2012-10-29 18:08:18 +000057 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000058 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000059 static_cast<void*>(broadcaster),
60 broadcaster->GetBroadcasterName().GetCString(),
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000061 m_type, event_name.GetString().c_str());
Greg Clayton6a3efac2012-10-29 18:08:18 +000062 else
63 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000064 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000065 static_cast<void*>(broadcaster),
66 broadcaster->GetBroadcasterName().GetCString(), m_type);
Greg Clayton6a3efac2012-10-29 18:08:18 +000067 }
68 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000069 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
70 static_cast<const void*>(this), m_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000072 if (m_data_ap)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073 {
74 s->PutChar('{');
75 m_data_ap->Dump (s);
76 s->PutChar('}');
77 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000078 else
79 s->Printf ("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080}
81
Chris Lattner30fdc8d2010-06-08 16:52:24 +000082void
83Event::DoOnRemoval ()
84{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000085 if (m_data_ap)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086 m_data_ap->DoOnRemoval (this);
87}
88
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000089EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000090
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000091EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000092
93void
94EventData::Dump (Stream *s) const
95{
96 s->PutCString ("Generic Event Data");
97}
98
99EventDataBytes::EventDataBytes () :
100 m_bytes()
101{
102}
103
104EventDataBytes::EventDataBytes (const char *cstr) :
105 m_bytes()
106{
107 SetBytesFromCString (cstr);
108}
109
110EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
111 m_bytes()
112{
113 SetBytes (src, src_len);
114}
115
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000116EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117
118const ConstString &
119EventDataBytes::GetFlavorString ()
120{
121 static ConstString g_flavor ("EventDataBytes");
122 return g_flavor;
123}
124
125const ConstString &
126EventDataBytes::GetFlavor () const
127{
128 return EventDataBytes::GetFlavorString ();
129}
130
131void
132EventDataBytes::Dump (Stream *s) const
133{
134 size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint);
135 if (num_printable_chars == m_bytes.size())
136 {
137 s->Printf("\"%s\"", m_bytes.c_str());
138 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000139 else if (!m_bytes.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140 {
141 DataExtractor data;
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000142 data.SetData(m_bytes.data(), m_bytes.size(), endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000143 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
144 }
145}
146
147const void *
148EventDataBytes::GetBytes() const
149{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000150 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000151}
152
153size_t
154EventDataBytes::GetByteSize() const
155{
156 return m_bytes.size ();
157}
158
159void
160EventDataBytes::SetBytes (const void *src, size_t src_len)
161{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000162 if (src != nullptr && src_len > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000163 m_bytes.assign ((const char *)src, src_len);
164 else
165 m_bytes.clear();
166}
167
168void
169EventDataBytes::SetBytesFromCString (const char *cstr)
170{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000171 if (cstr != nullptr && cstr[0])
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000172 m_bytes.assign (cstr);
173 else
174 m_bytes.clear();
175}
176
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177const void *
178EventDataBytes::GetBytesFromEvent (const Event *event_ptr)
179{
180 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000181 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000182 return e->GetBytes();
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000183 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184}
185
186size_t
187EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr)
188{
189 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000190 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191 return e->GetByteSize();
192 return 0;
193}
194
195const EventDataBytes *
196EventDataBytes::GetEventDataFromEvent (const Event *event_ptr)
197{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000198 if (event_ptr != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199 {
200 const EventData *event_data = event_ptr->GetData();
201 if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString())
202 return static_cast <const EventDataBytes *> (event_data);
203 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000204 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000205}
206
Caroline Tice969ed3d2011-05-02 20:41:46 +0000207void
208EventDataBytes::SwapBytes (std::string &new_bytes)
209{
210 m_bytes.swap (new_bytes);
211}