blob: 10feae5d4ebbcd8b4b15132b80db9092104547c9 [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 Clayton952e9dc2013-03-27 23:08:40 +000031 Log *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 Clayton952e9dc2013-03-27 23:08:40 +000082 Log *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 Clayton952e9dc2013-03-27 23:08:40 +0000110 Log *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 Clayton952e9dc2013-03-27 23:08:40 +0000126 Log *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 Clayton952e9dc2013-03-27 23:08:40 +0000140 Log *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 Clayton952e9dc2013-03-27 23:08:40 +0000174 Log *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 Clayton952e9dc2013-03-27 23:08:40 +0000185 Log *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
191 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000192 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000193
194 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000195}
196
197
198bool
199SBCommunication::ReadThreadStop ()
200{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000201 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000202 if (log)
203 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000204
205 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000206 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000207 success = m_opaque->StopReadThread ();
208
209 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000210 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000211
212 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000213}
214
215bool
216SBCommunication::ReadThreadIsRunning ()
217{
Greg Claytona66ba462010-10-30 04:51:46 +0000218 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000219 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000220 result = m_opaque->ReadThreadIsRunning ();
Greg Clayton952e9dc2013-03-27 23:08:40 +0000221 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000222 if (log)
223 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
224 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000225}
226
227bool
228SBCommunication::SetReadThreadBytesReceivedCallback
229(
230 ReadThreadBytesReceived callback,
231 void *callback_baton
232)
233{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000234 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000235
Greg Claytona66ba462010-10-30 04:51:46 +0000236 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000237 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000238 {
Greg Clayton63094e02010-06-23 01:19:29 +0000239 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Claytona66ba462010-10-30 04:51:46 +0000240 result = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000241 }
Caroline Tice7826c882010-10-26 03:11:13 +0000242
243 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000244 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
245 m_opaque, callback, callback_baton, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000246
Greg Claytona66ba462010-10-30 04:51:46 +0000247 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000248}
249
250SBBroadcaster
251SBCommunication::GetBroadcaster ()
252{
Greg Clayton63094e02010-06-23 01:19:29 +0000253 SBBroadcaster broadcaster (m_opaque, false);
Greg Claytona66ba462010-10-30 04:51:46 +0000254
Greg Clayton952e9dc2013-03-27 23:08:40 +0000255 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000256
257 if (log)
258 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
259 m_opaque, broadcaster.get());
260
Chris Lattner24943d22010-06-08 16:52:24 +0000261 return broadcaster;
262}
263
Jim Ingham5a15e692012-02-16 06:50:00 +0000264const char *
265SBCommunication::GetBroadcasterClass ()
266{
267 return Communication::GetStaticBroadcasterClass().AsCString();
268}
Chris Lattner24943d22010-06-08 16:52:24 +0000269
270//
271//void
272//SBCommunication::CreateIfNeeded ()
273//{
Greg Clayton63094e02010-06-23 01:19:29 +0000274// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000275// {
276// static uint32_t g_broadcaster_num;
277// char broadcaster_name[256];
278// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000279// m_opaque = new Communication (broadcaster_name);
280// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000281// }
Greg Clayton63094e02010-06-23 01:19:29 +0000282// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000283//}
284//
285//