blob: 9db6c444902cab7aa45f27ef825f540b5d5a07f8 [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
47SBCommunication::GetCloseOnEOF ()
48{
49 if (m_opaque)
50 return m_opaque->GetCloseOnEOF ();
51 return false;
52}
53
54void
55SBCommunication::SetCloseOnEOF (bool b)
56{
57 if (m_opaque)
58 m_opaque->SetCloseOnEOF (b);
59}
60
Chris Lattner24943d22010-06-08 16:52:24 +000061ConnectionStatus
62SBCommunication::CheckIfBytesAvailable ()
63{
Greg Clayton63094e02010-06-23 01:19:29 +000064 if (m_opaque)
65 return m_opaque->BytesAvailable (0, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000066 return eConnectionStatusNoConnection;
67}
68
69ConnectionStatus
70SBCommunication::WaitForBytesAvailableInfinite ()
71{
Greg Clayton63094e02010-06-23 01:19:29 +000072 if (m_opaque)
73 return m_opaque->BytesAvailable (UINT32_MAX, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000074 return eConnectionStatusNoConnection;
75}
76
77ConnectionStatus
78SBCommunication::WaitForBytesAvailableWithTimeout (uint32_t timeout_usec)
79{
Greg Clayton63094e02010-06-23 01:19:29 +000080 if (m_opaque)
81 return m_opaque->BytesAvailable (timeout_usec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000082 return eConnectionStatusNoConnection;
83}
84
85ConnectionStatus
86SBCommunication::Connect (const char *url)
87{
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 ())
91 m_opaque->SetConnection (new ConnectionFileDescriptor());
92 return m_opaque->Connect (url, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000093 }
94 return eConnectionStatusNoConnection;
95}
96
97ConnectionStatus
98SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
99{
Greg Claytone005f2c2010-11-06 01:53:30 +0000100 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000101
Greg Claytona66ba462010-10-30 04:51:46 +0000102 ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +0000103 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000104 {
Greg Clayton63094e02010-06-23 01:19:29 +0000105 if (m_opaque->HasConnection ())
Chris Lattner24943d22010-06-08 16:52:24 +0000106 {
Greg Clayton63094e02010-06-23 01:19:29 +0000107 if (m_opaque->IsConnected())
Caroline Tice7826c882010-10-26 03:11:13 +0000108 m_opaque->Disconnect();
Chris Lattner24943d22010-06-08 16:52:24 +0000109 }
Greg Clayton63094e02010-06-23 01:19:29 +0000110 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
111 if (m_opaque->IsConnected())
Greg Claytona66ba462010-10-30 04:51:46 +0000112 status = eConnectionStatusSuccess;
Chris Lattner24943d22010-06-08 16:52:24 +0000113 else
Greg Claytona66ba462010-10-30 04:51:46 +0000114 status = eConnectionStatusLostConnection;
Chris Lattner24943d22010-06-08 16:52:24 +0000115 }
Caroline Tice7826c882010-10-26 03:11:13 +0000116
117 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000118 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
119 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000120
Greg Claytona66ba462010-10-30 04:51:46 +0000121 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
124
125ConnectionStatus
126SBCommunication::Disconnect ()
127{
Greg Claytone005f2c2010-11-06 01:53:30 +0000128 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000129
Caroline Tice7826c882010-10-26 03:11:13 +0000130 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +0000131 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000132 status = m_opaque->Disconnect ();
133
134 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000135 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque,
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000136 Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000139}
140
141bool
142SBCommunication::IsConnected () const
143{
Greg Claytone005f2c2010-11-06 01:53:30 +0000144 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000145 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000146 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000147 result = m_opaque->IsConnected ();
148
149 if (log)
150 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result);
151
Chris Lattner24943d22010-06-08 16:52:24 +0000152 return false;
153}
154
155size_t
156SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
157{
Greg Claytone005f2c2010-11-06 01:53:30 +0000158 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000159 if (log)
160 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status)...",
161 m_opaque, dst, dst_len, timeout_usec);
162 size_t bytes_read = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000163 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000164 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
165 else
166 status = eConnectionStatusNoConnection;
167
168 if (log)
169 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status=%s) => %zu",
170 m_opaque, dst, dst_len, timeout_usec, Communication::ConnectionStatusAsCString (status),
171 bytes_read);
172 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000173}
174
175
176size_t
177SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
178{
Greg Claytona66ba462010-10-30 04:51:46 +0000179 size_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000180 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000181 bytes_written = m_opaque->Write (src, src_len, status, NULL);
182 else
183 status = eConnectionStatusNoConnection;
184
Greg Claytone005f2c2010-11-06 01:53:30 +0000185 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000186 if (log)
187 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%zu, &status=%s) => %zu",
188 m_opaque, src, src_len, Communication::ConnectionStatusAsCString (status), bytes_written);
189
Chris Lattner24943d22010-06-08 16:52:24 +0000190 return 0;
191}
192
193bool
194SBCommunication::ReadThreadStart ()
195{
Greg Claytone005f2c2010-11-06 01:53:30 +0000196 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000197
Caroline Tice7826c882010-10-26 03:11:13 +0000198 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000199 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000200 success = m_opaque->StartReadThread ();
201
Caroline Tice926060e2010-10-29 21:48:37 +0000202 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000203 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000204 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000205
206 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000207}
208
209
210bool
211SBCommunication::ReadThreadStop ()
212{
Greg Claytone005f2c2010-11-06 01:53:30 +0000213 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000214 if (log)
215 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000216
217 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000218 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000219 success = m_opaque->StopReadThread ();
220
221 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000222 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Tice7826c882010-10-26 03:11:13 +0000223
224 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000225}
226
227bool
228SBCommunication::ReadThreadIsRunning ()
229{
Greg Claytona66ba462010-10-30 04:51:46 +0000230 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000231 if (m_opaque)
Greg Claytona66ba462010-10-30 04:51:46 +0000232 result = m_opaque->ReadThreadIsRunning ();
Greg Claytone005f2c2010-11-06 01:53:30 +0000233 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000234 if (log)
235 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
236 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000237}
238
239bool
240SBCommunication::SetReadThreadBytesReceivedCallback
241(
242 ReadThreadBytesReceived callback,
243 void *callback_baton
244)
245{
Greg Claytone005f2c2010-11-06 01:53:30 +0000246 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000247
Greg Claytona66ba462010-10-30 04:51:46 +0000248 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000249 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000250 {
Greg Clayton63094e02010-06-23 01:19:29 +0000251 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Claytona66ba462010-10-30 04:51:46 +0000252 result = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000253 }
Caroline Tice7826c882010-10-26 03:11:13 +0000254
255 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000256 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
257 m_opaque, callback, callback_baton, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000258
Greg Claytona66ba462010-10-30 04:51:46 +0000259 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000260}
261
262SBBroadcaster
263SBCommunication::GetBroadcaster ()
264{
Greg Clayton63094e02010-06-23 01:19:29 +0000265 SBBroadcaster broadcaster (m_opaque, false);
Greg Claytona66ba462010-10-30 04:51:46 +0000266
Greg Claytone005f2c2010-11-06 01:53:30 +0000267 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000268
269 if (log)
270 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
271 m_opaque, broadcaster.get());
272
Chris Lattner24943d22010-06-08 16:52:24 +0000273 return broadcaster;
274}
275
276
277//
278//void
279//SBCommunication::CreateIfNeeded ()
280//{
Greg Clayton63094e02010-06-23 01:19:29 +0000281// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000282// {
283// static uint32_t g_broadcaster_num;
284// char broadcaster_name[256];
285// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000286// m_opaque = new Communication (broadcaster_name);
287// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000288// }
Greg Clayton63094e02010-06-23 01:19:29 +0000289// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000290//}
291//
292//