blob: 6b5ddb37cd69d8808189c88cc0665cfd35ab96bc [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)
142 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status)...",
143 m_opaque, dst, dst_len, timeout_usec);
144 size_t bytes_read = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000145 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000146 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
147 else
148 status = eConnectionStatusNoConnection;
149
150 if (log)
151 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status=%s) => %zu",
152 m_opaque, dst, dst_len, timeout_usec, Communication::ConnectionStatusAsCString (status),
153 bytes_read);
154 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000155}
156
157
158size_t
159SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
160{
Greg Claytona66ba462010-10-30 04:51:46 +0000161 size_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000162 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000163 bytes_written = m_opaque->Write (src, src_len, status, NULL);
164 else
165 status = eConnectionStatusNoConnection;
166
Greg Claytone005f2c2010-11-06 01:53:30 +0000167 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000168 if (log)
169 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%zu, &status=%s) => %zu",
170 m_opaque, src, src_len, Communication::ConnectionStatusAsCString (status), bytes_written);
171
Chris Lattner24943d22010-06-08 16:52:24 +0000172 return 0;
173}
174
175bool
176SBCommunication::ReadThreadStart ()
177{
Greg Claytone005f2c2010-11-06 01:53:30 +0000178 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000179
Caroline Tice7826c882010-10-26 03:11:13 +0000180 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000181 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000182 success = m_opaque->StartReadThread ();
183
Caroline Tice926060e2010-10-29 21:48:37 +0000184 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000185 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000186 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000187
188 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000189}
190
191
192bool
193SBCommunication::ReadThreadStop ()
194{
Greg Claytone005f2c2010-11-06 01:53:30 +0000195 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000196 if (log)
197 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000198
199 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000200 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000201 success = m_opaque->StopReadThread ();
202
203 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000204 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000205
206 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000207}
208
209bool
210SBCommunication::ReadThreadIsRunning ()
211{
Greg Claytona66ba462010-10-30 04:51:46 +0000212 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000213 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000214 result = m_opaque->ReadThreadIsRunning ();
Greg Claytone005f2c2010-11-06 01:53:30 +0000215 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000216 if (log)
217 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
218 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000219}
220
221bool
222SBCommunication::SetReadThreadBytesReceivedCallback
223(
224 ReadThreadBytesReceived callback,
225 void *callback_baton
226)
227{
Greg Claytone005f2c2010-11-06 01:53:30 +0000228 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000229
Greg Claytona66ba462010-10-30 04:51:46 +0000230 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000231 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000232 {
Greg Clayton63094e02010-06-23 01:19:29 +0000233 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Claytona66ba462010-10-30 04:51:46 +0000234 result = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000235 }
Caroline Tice7826c882010-10-26 03:11:13 +0000236
237 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000238 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
239 m_opaque, callback, callback_baton, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000240
Greg Claytona66ba462010-10-30 04:51:46 +0000241 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000242}
243
244SBBroadcaster
245SBCommunication::GetBroadcaster ()
246{
Greg Clayton63094e02010-06-23 01:19:29 +0000247 SBBroadcaster broadcaster (m_opaque, false);
Greg Claytona66ba462010-10-30 04:51:46 +0000248
Greg Claytone005f2c2010-11-06 01:53:30 +0000249 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000250
251 if (log)
252 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
253 m_opaque, broadcaster.get());
254
Chris Lattner24943d22010-06-08 16:52:24 +0000255 return broadcaster;
256}
257
258
259//
260//void
261//SBCommunication::CreateIfNeeded ()
262//{
Greg Clayton63094e02010-06-23 01:19:29 +0000263// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000264// {
265// static uint32_t g_broadcaster_num;
266// char broadcaster_name[256];
267// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000268// m_opaque = new Communication (broadcaster_name);
269// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000270// }
Greg Clayton63094e02010-06-23 01:19:29 +0000271// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000272//}
273//
274//