blob: f96a064c6e248404737f2598814091f18b94aaad [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBCommunication.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/API/SBCommunication.h"
11#include "lldb/API/SBBroadcaster.h"
12#include "lldb/Core/Communication.h"
13#include "lldb/Core/ConnectionFileDescriptor.h"
Caroline Tice7826c882010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000015
16using namespace lldb;
17using namespace lldb_private;
18
19
20
21SBCommunication::SBCommunication() :
Greg Clayton63094e02010-06-23 01:19:29 +000022 m_opaque (NULL),
23 m_opaque_owned (false)
Chris Lattner24943d22010-06-08 16:52:24 +000024{
25}
26
Greg Claytoneecb0f32010-12-04 02:39:47 +000027SBCommunication::SBCommunication(const char * broadcaster_name) :
28 m_opaque (new Communication (broadcaster_name)),
Greg Clayton63094e02010-06-23 01:19:29 +000029 m_opaque_owned (true)
Chris Lattner24943d22010-06-08 16:52:24 +000030{
Greg Claytone005f2c2010-11-06 01:53:30 +000031 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000032
33 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000034 log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
35 "SBCommunication(%p)", broadcaster_name, m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +000036}
37
38SBCommunication::~SBCommunication()
39{
Greg Clayton63094e02010-06-23 01:19:29 +000040 if (m_opaque && m_opaque_owned)
41 delete m_opaque;
42 m_opaque = NULL;
43 m_opaque_owned = false;
Chris Lattner24943d22010-06-08 16:52:24 +000044}
45
Greg Claytoneecb0f32010-12-04 02:39:47 +000046bool
Johnny Chend2554b52011-06-20 22:30:48 +000047SBCommunication::IsValid () const
48{
49 return m_opaque != NULL;
50}
51
52bool
Greg Claytoneecb0f32010-12-04 02:39:47 +000053SBCommunication::GetCloseOnEOF ()
54{
55 if (m_opaque)
56 return m_opaque->GetCloseOnEOF ();
57 return false;
58}
59
60void
61SBCommunication::SetCloseOnEOF (bool b)
62{
63 if (m_opaque)
64 m_opaque->SetCloseOnEOF (b);
65}
66
Chris Lattner24943d22010-06-08 16:52:24 +000067ConnectionStatus
Chris Lattner24943d22010-06-08 16:52:24 +000068SBCommunication::Connect (const char *url)
69{
Greg Clayton63094e02010-06-23 01:19:29 +000070 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000071 {
Greg Clayton63094e02010-06-23 01:19:29 +000072 if (!m_opaque->HasConnection ())
73 m_opaque->SetConnection (new ConnectionFileDescriptor());
74 return m_opaque->Connect (url, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000075 }
76 return eConnectionStatusNoConnection;
77}
78
79ConnectionStatus
80SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
81{
Greg Claytone005f2c2010-11-06 01:53:30 +000082 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000083
Greg Claytona66ba462010-10-30 04:51:46 +000084 ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +000085 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000086 {
Greg Clayton63094e02010-06-23 01:19:29 +000087 if (m_opaque->HasConnection ())
Chris Lattner24943d22010-06-08 16:52:24 +000088 {
Greg Clayton63094e02010-06-23 01:19:29 +000089 if (m_opaque->IsConnected())
Caroline Tice7826c882010-10-26 03:11:13 +000090 m_opaque->Disconnect();
Chris Lattner24943d22010-06-08 16:52:24 +000091 }
Greg Clayton63094e02010-06-23 01:19:29 +000092 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
93 if (m_opaque->IsConnected())
Greg Claytona66ba462010-10-30 04:51:46 +000094 status = eConnectionStatusSuccess;
Chris Lattner24943d22010-06-08 16:52:24 +000095 else
Greg Claytona66ba462010-10-30 04:51:46 +000096 status = eConnectionStatusLostConnection;
Chris Lattner24943d22010-06-08 16:52:24 +000097 }
Caroline Tice7826c882010-10-26 03:11:13 +000098
99 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000100 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
101 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000102
Greg Claytona66ba462010-10-30 04:51:46 +0000103 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000104}
105
106
107ConnectionStatus
108SBCommunication::Disconnect ()
109{
Greg Claytone005f2c2010-11-06 01:53:30 +0000110 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000111
Caroline Tice7826c882010-10-26 03:11:13 +0000112 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +0000113 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000114 status = m_opaque->Disconnect ();
115
116 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000117 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque,
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000118 Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000119
120 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000121}
122
123bool
124SBCommunication::IsConnected () const
125{
Greg Claytone005f2c2010-11-06 01:53:30 +0000126 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000127 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000128 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000129 result = m_opaque->IsConnected ();
130
131 if (log)
132 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result);
133
Chris Lattner24943d22010-06-08 16:52:24 +0000134 return false;
135}
136
137size_t
138SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
139{
Greg Claytone005f2c2010-11-06 01:53:30 +0000140 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000141 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000142 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status)...",
Greg Clayton851e30e2012-09-18 18:04:04 +0000143 m_opaque,
144 dst,
145 (uint64_t)dst_len,
146 timeout_usec);
Greg Claytona66ba462010-10-30 04:51:46 +0000147 size_t bytes_read = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000148 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000149 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
150 else
151 status = eConnectionStatusNoConnection;
152
153 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000154 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status=%s) => %" PRIu64,
Greg Clayton851e30e2012-09-18 18:04:04 +0000155 m_opaque,
156 dst,
157 (uint64_t)dst_len,
158 timeout_usec,
159 Communication::ConnectionStatusAsCString (status),
160 (uint64_t)bytes_read);
Greg Claytona66ba462010-10-30 04:51:46 +0000161 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164
165size_t
166SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
167{
Greg Claytona66ba462010-10-30 04:51:46 +0000168 size_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000169 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000170 bytes_written = m_opaque->Write (src, src_len, status, NULL);
171 else
172 status = eConnectionStatusNoConnection;
173
Greg Claytone005f2c2010-11-06 01:53:30 +0000174 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000175 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000176 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64 ", &status=%s) => %" PRIu64,
Greg Clayton851e30e2012-09-18 18:04:04 +0000177 m_opaque, src, (uint64_t)src_len, Communication::ConnectionStatusAsCString (status), (uint64_t)bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +0000178
Chris Lattner24943d22010-06-08 16:52:24 +0000179 return 0;
180}
181
182bool
183SBCommunication::ReadThreadStart ()
184{
Greg Claytone005f2c2010-11-06 01:53:30 +0000185 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000186
Caroline Tice7826c882010-10-26 03:11:13 +0000187 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000188 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000189 success = m_opaque->StartReadThread ();
190
Caroline Tice926060e2010-10-29 21:48:37 +0000191 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000192 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000193 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000194
195 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000196}
197
198
199bool
200SBCommunication::ReadThreadStop ()
201{
Greg Claytone005f2c2010-11-06 01:53:30 +0000202 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000203 if (log)
204 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000205
206 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000207 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000208 success = m_opaque->StopReadThread ();
209
210 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000211 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000212
213 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000214}
215
216bool
217SBCommunication::ReadThreadIsRunning ()
218{
Greg Claytona66ba462010-10-30 04:51:46 +0000219 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000220 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000221 result = m_opaque->ReadThreadIsRunning ();
Greg Claytone005f2c2010-11-06 01:53:30 +0000222 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000223 if (log)
224 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
225 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000226}
227
228bool
229SBCommunication::SetReadThreadBytesReceivedCallback
230(
231 ReadThreadBytesReceived callback,
232 void *callback_baton
233)
234{
Greg Claytone005f2c2010-11-06 01:53:30 +0000235 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000236
Greg Claytona66ba462010-10-30 04:51:46 +0000237 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000238 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000239 {
Greg Clayton63094e02010-06-23 01:19:29 +0000240 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Claytona66ba462010-10-30 04:51:46 +0000241 result = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000242 }
Caroline Tice7826c882010-10-26 03:11:13 +0000243
244 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000245 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
246 m_opaque, callback, callback_baton, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000247
Greg Claytona66ba462010-10-30 04:51:46 +0000248 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000249}
250
251SBBroadcaster
252SBCommunication::GetBroadcaster ()
253{
Greg Clayton63094e02010-06-23 01:19:29 +0000254 SBBroadcaster broadcaster (m_opaque, false);
Greg Claytona66ba462010-10-30 04:51:46 +0000255
Greg Claytone005f2c2010-11-06 01:53:30 +0000256 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000257
258 if (log)
259 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
260 m_opaque, broadcaster.get());
261
Chris Lattner24943d22010-06-08 16:52:24 +0000262 return broadcaster;
263}
264
Jim Ingham5a15e692012-02-16 06:50:00 +0000265const char *
266SBCommunication::GetBroadcasterClass ()
267{
268 return Communication::GetStaticBroadcasterClass().AsCString();
269}
Chris Lattner24943d22010-06-08 16:52:24 +0000270
271//
272//void
273//SBCommunication::CreateIfNeeded ()
274//{
Greg Clayton63094e02010-06-23 01:19:29 +0000275// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000276// {
277// static uint32_t g_broadcaster_num;
278// char broadcaster_name[256];
279// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000280// m_opaque = new Communication (broadcaster_name);
281// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000282// }
Greg Clayton63094e02010-06-23 01:19:29 +0000283// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000284//}
285//
286//