blob: 160640683d1ac78ac6aa21bed56150ca52488795 [file] [log] [blame]
Chris Lattner30fdc8d2010-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 Ticeceb6b132010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
16using namespace lldb;
17using namespace lldb_private;
18
19
20
21SBCommunication::SBCommunication() :
Greg Clayton66111032010-06-23 01:19:29 +000022 m_opaque (NULL),
23 m_opaque_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024{
25}
26
Greg Claytond46c87a2010-12-04 02:39:47 +000027SBCommunication::SBCommunication(const char * broadcaster_name) :
28 m_opaque (new Communication (broadcaster_name)),
Greg Clayton66111032010-06-23 01:19:29 +000029 m_opaque_owned (true)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030{
Greg Clayton2d4edfb2010-11-06 01:53:30 +000031 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000032
33 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +000034 log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
35 "SBCommunication(%p)", broadcaster_name, m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036}
37
38SBCommunication::~SBCommunication()
39{
Greg Clayton66111032010-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 Lattner30fdc8d2010-06-08 16:52:24 +000044}
45
Greg Claytond46c87a2010-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 Lattner30fdc8d2010-06-08 16:52:24 +000061ConnectionStatus
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062SBCommunication::Connect (const char *url)
63{
Greg Clayton66111032010-06-23 01:19:29 +000064 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065 {
Greg Clayton66111032010-06-23 01:19:29 +000066 if (!m_opaque->HasConnection ())
67 m_opaque->SetConnection (new ConnectionFileDescriptor());
68 return m_opaque->Connect (url, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069 }
70 return eConnectionStatusNoConnection;
71}
72
73ConnectionStatus
74SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
75{
Greg Clayton2d4edfb2010-11-06 01:53:30 +000076 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000077
Greg Clayton48381312010-10-30 04:51:46 +000078 ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton66111032010-06-23 01:19:29 +000079 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080 {
Greg Clayton66111032010-06-23 01:19:29 +000081 if (m_opaque->HasConnection ())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000082 {
Greg Clayton66111032010-06-23 01:19:29 +000083 if (m_opaque->IsConnected())
Caroline Ticeceb6b132010-10-26 03:11:13 +000084 m_opaque->Disconnect();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085 }
Greg Clayton66111032010-06-23 01:19:29 +000086 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
87 if (m_opaque->IsConnected())
Greg Clayton48381312010-10-30 04:51:46 +000088 status = eConnectionStatusSuccess;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000089 else
Greg Clayton48381312010-10-30 04:51:46 +000090 status = eConnectionStatusLostConnection;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091 }
Caroline Ticeceb6b132010-10-26 03:11:13 +000092
93 if (log)
Greg Clayton48381312010-10-30 04:51:46 +000094 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
95 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status));
Caroline Ticeceb6b132010-10-26 03:11:13 +000096
Greg Clayton48381312010-10-30 04:51:46 +000097 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098}
99
100
101ConnectionStatus
102SBCommunication::Disconnect ()
103{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000104 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000105
Caroline Ticeceb6b132010-10-26 03:11:13 +0000106 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton66111032010-06-23 01:19:29 +0000107 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000108 status = m_opaque->Disconnect ();
109
110 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000111 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque,
Caroline Tice750cd172010-10-26 23:49:36 +0000112 Communication::ConnectionStatusAsCString (status));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000113
114 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000115}
116
117bool
118SBCommunication::IsConnected () const
119{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000120 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000121 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000122 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000123 result = m_opaque->IsConnected ();
124
125 if (log)
126 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result);
127
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128 return false;
129}
130
131size_t
132SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
133{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000134 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000135 if (log)
136 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status)...",
137 m_opaque, dst, dst_len, timeout_usec);
138 size_t bytes_read = 0;
Greg Clayton66111032010-06-23 01:19:29 +0000139 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000140 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
141 else
142 status = eConnectionStatusNoConnection;
143
144 if (log)
145 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status=%s) => %zu",
146 m_opaque, dst, dst_len, timeout_usec, Communication::ConnectionStatusAsCString (status),
147 bytes_read);
148 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000149}
150
151
152size_t
153SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
154{
Greg Clayton48381312010-10-30 04:51:46 +0000155 size_t bytes_written = 0;
Greg Clayton66111032010-06-23 01:19:29 +0000156 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000157 bytes_written = m_opaque->Write (src, src_len, status, NULL);
158 else
159 status = eConnectionStatusNoConnection;
160
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000161 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000162 if (log)
163 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%zu, &status=%s) => %zu",
164 m_opaque, src, src_len, Communication::ConnectionStatusAsCString (status), bytes_written);
165
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166 return 0;
167}
168
169bool
170SBCommunication::ReadThreadStart ()
171{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000172 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000173
Caroline Ticeceb6b132010-10-26 03:11:13 +0000174 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000175 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000176 success = m_opaque->StartReadThread ();
177
Caroline Tice20ad3c42010-10-29 21:48:37 +0000178 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000179 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000180 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000181
182 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183}
184
185
186bool
187SBCommunication::ReadThreadStop ()
188{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000189 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000190 if (log)
191 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000192
193 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000194 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000195 success = m_opaque->StopReadThread ();
196
197 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000198 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000199
200 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000201}
202
203bool
204SBCommunication::ReadThreadIsRunning ()
205{
Greg Clayton48381312010-10-30 04:51:46 +0000206 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000207 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000208 result = m_opaque->ReadThreadIsRunning ();
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000209 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000210 if (log)
211 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
212 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000213}
214
215bool
216SBCommunication::SetReadThreadBytesReceivedCallback
217(
218 ReadThreadBytesReceived callback,
219 void *callback_baton
220)
221{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000222 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000223
Greg Clayton48381312010-10-30 04:51:46 +0000224 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000225 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000226 {
Greg Clayton66111032010-06-23 01:19:29 +0000227 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Clayton48381312010-10-30 04:51:46 +0000228 result = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000230
231 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000232 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
233 m_opaque, callback, callback_baton, result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000234
Greg Clayton48381312010-10-30 04:51:46 +0000235 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236}
237
238SBBroadcaster
239SBCommunication::GetBroadcaster ()
240{
Greg Clayton66111032010-06-23 01:19:29 +0000241 SBBroadcaster broadcaster (m_opaque, false);
Greg Clayton48381312010-10-30 04:51:46 +0000242
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000243 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000244
245 if (log)
246 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
247 m_opaque, broadcaster.get());
248
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000249 return broadcaster;
250}
251
252
253//
254//void
255//SBCommunication::CreateIfNeeded ()
256//{
Greg Clayton66111032010-06-23 01:19:29 +0000257// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258// {
259// static uint32_t g_broadcaster_num;
260// char broadcaster_name[256];
261// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000262// m_opaque = new Communication (broadcaster_name);
263// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000264// }
Greg Clayton66111032010-06-23 01:19:29 +0000265// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266//}
267//
268//