blob: fca4882f5231ab1817a54b9d1084189b4a1496c0 [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
27SBCommunication::SBCommunication(const char * broadcaster_name) :
Greg Clayton63094e02010-06-23 01:19:29 +000028 m_opaque (new Communication (broadcaster_name)),
29 m_opaque_owned (true)
Chris Lattner24943d22010-06-08 16:52:24 +000030{
Caroline Tice61ba7ec2010-10-26 23:49:36 +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
46ConnectionStatus
47SBCommunication::CheckIfBytesAvailable ()
48{
Greg Clayton63094e02010-06-23 01:19:29 +000049 if (m_opaque)
50 return m_opaque->BytesAvailable (0, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000051 return eConnectionStatusNoConnection;
52}
53
54ConnectionStatus
55SBCommunication::WaitForBytesAvailableInfinite ()
56{
Greg Clayton63094e02010-06-23 01:19:29 +000057 if (m_opaque)
58 return m_opaque->BytesAvailable (UINT32_MAX, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000059 return eConnectionStatusNoConnection;
60}
61
62ConnectionStatus
63SBCommunication::WaitForBytesAvailableWithTimeout (uint32_t timeout_usec)
64{
Greg Clayton63094e02010-06-23 01:19:29 +000065 if (m_opaque)
66 return m_opaque->BytesAvailable (timeout_usec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000067 return eConnectionStatusNoConnection;
68}
69
70ConnectionStatus
71SBCommunication::Connect (const char *url)
72{
Greg Clayton63094e02010-06-23 01:19:29 +000073 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000074 {
Greg Clayton63094e02010-06-23 01:19:29 +000075 if (!m_opaque->HasConnection ())
76 m_opaque->SetConnection (new ConnectionFileDescriptor());
77 return m_opaque->Connect (url, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000078 }
79 return eConnectionStatusNoConnection;
80}
81
82ConnectionStatus
83SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
84{
Caroline Tice7826c882010-10-26 03:11:13 +000085 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
86
Greg Claytona66ba462010-10-30 04:51:46 +000087 ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +000088 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000089 {
Greg Clayton63094e02010-06-23 01:19:29 +000090 if (m_opaque->HasConnection ())
Chris Lattner24943d22010-06-08 16:52:24 +000091 {
Greg Clayton63094e02010-06-23 01:19:29 +000092 if (m_opaque->IsConnected())
Caroline Tice7826c882010-10-26 03:11:13 +000093 m_opaque->Disconnect();
Chris Lattner24943d22010-06-08 16:52:24 +000094 }
Greg Clayton63094e02010-06-23 01:19:29 +000095 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
96 if (m_opaque->IsConnected())
Greg Claytona66ba462010-10-30 04:51:46 +000097 status = eConnectionStatusSuccess;
Chris Lattner24943d22010-06-08 16:52:24 +000098 else
Greg Claytona66ba462010-10-30 04:51:46 +000099 status = eConnectionStatusLostConnection;
Chris Lattner24943d22010-06-08 16:52:24 +0000100 }
Caroline Tice7826c882010-10-26 03:11:13 +0000101
102 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000103 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
104 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000105
Greg Claytona66ba462010-10-30 04:51:46 +0000106 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
109
110ConnectionStatus
111SBCommunication::Disconnect ()
112{
Caroline Tice7826c882010-10-26 03:11:13 +0000113 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
114
Caroline Tice7826c882010-10-26 03:11:13 +0000115 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +0000116 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000117 status = m_opaque->Disconnect ();
118
119 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000120 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque,
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000121 Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000122
123 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000124}
125
126bool
127SBCommunication::IsConnected () const
128{
Greg Claytona66ba462010-10-30 04:51:46 +0000129 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
130 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000131 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000132 result = m_opaque->IsConnected ();
133
134 if (log)
135 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result);
136
Chris Lattner24943d22010-06-08 16:52:24 +0000137 return false;
138}
139
140size_t
141SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
142{
Greg Claytona66ba462010-10-30 04:51:46 +0000143 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
144 if (log)
145 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status)...",
146 m_opaque, dst, dst_len, timeout_usec);
147 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)
154 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status=%s) => %zu",
155 m_opaque, dst, dst_len, timeout_usec, Communication::ConnectionStatusAsCString (status),
156 bytes_read);
157 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000158}
159
160
161size_t
162SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
163{
Greg Claytona66ba462010-10-30 04:51:46 +0000164 size_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000165 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000166 bytes_written = m_opaque->Write (src, src_len, status, NULL);
167 else
168 status = eConnectionStatusNoConnection;
169
170 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
171 if (log)
172 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%zu, &status=%s) => %zu",
173 m_opaque, src, src_len, Communication::ConnectionStatusAsCString (status), bytes_written);
174
Chris Lattner24943d22010-06-08 16:52:24 +0000175 return 0;
176}
177
178bool
179SBCommunication::ReadThreadStart ()
180{
Caroline Tice7826c882010-10-26 03:11:13 +0000181 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
182
Caroline Tice7826c882010-10-26 03:11:13 +0000183 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000184 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000185 success = m_opaque->StartReadThread ();
186
Caroline Tice926060e2010-10-29 21:48:37 +0000187 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000188 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000189 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000190
191 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000192}
193
194
195bool
196SBCommunication::ReadThreadStop ()
197{
Greg Claytona66ba462010-10-30 04:51:46 +0000198 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
199 if (log)
200 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000201
202 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000203 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000204 success = m_opaque->StopReadThread ();
205
206 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000207 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000208
209 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000210}
211
212bool
213SBCommunication::ReadThreadIsRunning ()
214{
Greg Claytona66ba462010-10-30 04:51:46 +0000215 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000216 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000217 result = m_opaque->ReadThreadIsRunning ();
218 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
219 if (log)
220 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
221 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000222}
223
224bool
225SBCommunication::SetReadThreadBytesReceivedCallback
226(
227 ReadThreadBytesReceived callback,
228 void *callback_baton
229)
230{
Caroline Tice7826c882010-10-26 03:11:13 +0000231 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
232
Greg Claytona66ba462010-10-30 04:51:46 +0000233 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000234 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000235 {
Greg Clayton63094e02010-06-23 01:19:29 +0000236 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Claytona66ba462010-10-30 04:51:46 +0000237 result = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000238 }
Caroline Tice7826c882010-10-26 03:11:13 +0000239
240 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000241 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
242 m_opaque, callback, callback_baton, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000243
Greg Claytona66ba462010-10-30 04:51:46 +0000244 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000245}
246
247SBBroadcaster
248SBCommunication::GetBroadcaster ()
249{
Greg Clayton63094e02010-06-23 01:19:29 +0000250 SBBroadcaster broadcaster (m_opaque, false);
Greg Claytona66ba462010-10-30 04:51:46 +0000251
252 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
253
254 if (log)
255 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
256 m_opaque, broadcaster.get());
257
Chris Lattner24943d22010-06-08 16:52:24 +0000258 return broadcaster;
259}
260
261
262//
263//void
264//SBCommunication::CreateIfNeeded ()
265//{
Greg Clayton63094e02010-06-23 01:19:29 +0000266// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000267// {
268// static uint32_t g_broadcaster_num;
269// char broadcaster_name[256];
270// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000271// m_opaque = new Communication (broadcaster_name);
272// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000273// }
Greg Clayton63094e02010-06-23 01:19:29 +0000274// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000275//}
276//
277//