blob: 956b6cfcdd3198912e170e807966ea2fc21a3e65 [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"
Caroline Ticeceb6b132010-10-26 03:11:13 +000013#include "lldb/Core/Log.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000014#include "lldb/Host/ConnectionFileDescriptor.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 Clayton5160ce52013-03-27 23:08:40 +000031 Log *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\") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000035 "SBCommunication(%p)", broadcaster_name,
36 static_cast<void*>(m_opaque));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037}
38
39SBCommunication::~SBCommunication()
40{
Greg Clayton66111032010-06-23 01:19:29 +000041 if (m_opaque && m_opaque_owned)
42 delete m_opaque;
43 m_opaque = NULL;
44 m_opaque_owned = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
Greg Claytond46c87a2010-12-04 02:39:47 +000047bool
Johnny Chendd68ab82011-06-20 22:30:48 +000048SBCommunication::IsValid () const
49{
50 return m_opaque != NULL;
51}
52
53bool
Greg Claytond46c87a2010-12-04 02:39:47 +000054SBCommunication::GetCloseOnEOF ()
55{
56 if (m_opaque)
57 return m_opaque->GetCloseOnEOF ();
58 return false;
59}
60
61void
62SBCommunication::SetCloseOnEOF (bool b)
63{
64 if (m_opaque)
65 m_opaque->SetCloseOnEOF (b);
66}
67
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068ConnectionStatus
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069SBCommunication::Connect (const char *url)
70{
Greg Clayton66111032010-06-23 01:19:29 +000071 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000072 {
Greg Clayton66111032010-06-23 01:19:29 +000073 if (!m_opaque->HasConnection ())
Zachary Turner12792af2014-10-06 21:23:09 +000074 m_opaque->SetConnection(Connection::CreateDefaultConnection(url));
Greg Clayton66111032010-06-23 01:19:29 +000075 return m_opaque->Connect (url, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076 }
77 return eConnectionStatusNoConnection;
78}
79
80ConnectionStatus
81SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
82{
Greg Clayton5160ce52013-03-27 23:08:40 +000083 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000084
Greg Clayton48381312010-10-30 04:51:46 +000085 ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton66111032010-06-23 01:19:29 +000086 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000087 {
Greg Clayton66111032010-06-23 01:19:29 +000088 if (m_opaque->HasConnection ())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000089 {
Greg Clayton66111032010-06-23 01:19:29 +000090 if (m_opaque->IsConnected())
Caroline Ticeceb6b132010-10-26 03:11:13 +000091 m_opaque->Disconnect();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000092 }
Greg Clayton66111032010-06-23 01:19:29 +000093 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
94 if (m_opaque->IsConnected())
Greg Clayton48381312010-10-30 04:51:46 +000095 status = eConnectionStatusSuccess;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000096 else
Greg Clayton48381312010-10-30 04:51:46 +000097 status = eConnectionStatusLostConnection;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098 }
Caroline Ticeceb6b132010-10-26 03:11:13 +000099
100 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000101 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
102 static_cast<void*>(m_opaque), fd, owns_fd,
103 Communication::ConnectionStatusAsCString (status));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000104
Greg Clayton48381312010-10-30 04:51:46 +0000105 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000106}
107
108
109ConnectionStatus
110SBCommunication::Disconnect ()
111{
Greg Clayton5160ce52013-03-27 23:08:40 +0000112 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000113
Caroline Ticeceb6b132010-10-26 03:11:13 +0000114 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton66111032010-06-23 01:19:29 +0000115 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000116 status = m_opaque->Disconnect ();
117
118 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000119 log->Printf ("SBCommunication(%p)::Disconnect () => %s",
120 static_cast<void*>(m_opaque),
Caroline Tice750cd172010-10-26 23:49:36 +0000121 Communication::ConnectionStatusAsCString (status));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000122
123 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124}
125
126bool
127SBCommunication::IsConnected () const
128{
Greg Clayton5160ce52013-03-27 23:08:40 +0000129 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000130 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000131 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000132 result = m_opaque->IsConnected ();
133
134 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000135 log->Printf ("SBCommunication(%p)::IsConnected () => %i",
136 static_cast<void*>(m_opaque), result);
Greg Clayton48381312010-10-30 04:51:46 +0000137
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138 return false;
139}
140
141size_t
142SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
143{
Greg Clayton5160ce52013-03-27 23:08:40 +0000144 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000145 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000146 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status)...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000147 static_cast<void*>(m_opaque), static_cast<void*>(dst),
148 static_cast<uint64_t>(dst_len), timeout_usec);
Greg Clayton48381312010-10-30 04:51:46 +0000149 size_t bytes_read = 0;
Greg Clayton66111032010-06-23 01:19:29 +0000150 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000151 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
152 else
153 status = eConnectionStatusNoConnection;
154
155 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000156 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status=%s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000157 static_cast<void*>(m_opaque), static_cast<void*>(dst),
158 static_cast<uint64_t>(dst_len), timeout_usec,
Greg Clayton43e0af02012-09-18 18:04:04 +0000159 Communication::ConnectionStatusAsCString (status),
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000160 static_cast<uint64_t>(bytes_read));
Greg Clayton48381312010-10-30 04:51:46 +0000161 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162}
163
164
165size_t
166SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
167{
Greg Clayton48381312010-10-30 04:51:46 +0000168 size_t bytes_written = 0;
Greg Clayton66111032010-06-23 01:19:29 +0000169 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000170 bytes_written = m_opaque->Write (src, src_len, status, NULL);
171 else
172 status = eConnectionStatusNoConnection;
173
Greg Clayton5160ce52013-03-27 23:08:40 +0000174 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000175 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000176 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64 ", &status=%s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000177 static_cast<void*>(m_opaque), static_cast<const void*>(src),
178 static_cast<uint64_t>(src_len),
179 Communication::ConnectionStatusAsCString (status),
180 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +0000181
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000182 return 0;
183}
184
185bool
186SBCommunication::ReadThreadStart ()
187{
Greg Clayton5160ce52013-03-27 23:08:40 +0000188 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000189
Caroline Ticeceb6b132010-10-26 03:11:13 +0000190 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000191 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000192 success = m_opaque->StartReadThread ();
193
194 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000195 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i",
196 static_cast<void*>(m_opaque), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000197
198 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199}
200
201
202bool
203SBCommunication::ReadThreadStop ()
204{
Greg Clayton5160ce52013-03-27 23:08:40 +0000205 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000206 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000207 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...",
208 static_cast<void*>(m_opaque));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000209
210 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000211 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000212 success = m_opaque->StopReadThread ();
213
214 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000215 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i",
216 static_cast<void*>(m_opaque), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000217
218 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219}
220
221bool
222SBCommunication::ReadThreadIsRunning ()
223{
Greg Clayton48381312010-10-30 04:51:46 +0000224 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000225 if (m_opaque)
Greg Clayton48381312010-10-30 04:51:46 +0000226 result = m_opaque->ReadThreadIsRunning ();
Greg Clayton5160ce52013-03-27 23:08:40 +0000227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000228 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000229 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i",
230 static_cast<void*>(m_opaque), result);
Greg Clayton48381312010-10-30 04:51:46 +0000231 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000232}
233
234bool
235SBCommunication::SetReadThreadBytesReceivedCallback
236(
237 ReadThreadBytesReceived callback,
238 void *callback_baton
239)
240{
Greg Clayton5160ce52013-03-27 23:08:40 +0000241 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000242
Greg Clayton48381312010-10-30 04:51:46 +0000243 bool result = false;
Greg Clayton66111032010-06-23 01:19:29 +0000244 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000245 {
Greg Clayton66111032010-06-23 01:19:29 +0000246 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Greg Clayton48381312010-10-30 04:51:46 +0000247 result = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000249
250 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000251 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000252 static_cast<void*>(m_opaque),
David Majnemer12bb77d2014-07-22 22:12:58 +0000253 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(callback)),
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000254 static_cast<void*>(callback_baton), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000255
Greg Clayton48381312010-10-30 04:51:46 +0000256 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000257}
258
259SBBroadcaster
260SBCommunication::GetBroadcaster ()
261{
Greg Clayton66111032010-06-23 01:19:29 +0000262 SBBroadcaster broadcaster (m_opaque, false);
Greg Clayton48381312010-10-30 04:51:46 +0000263
Greg Clayton5160ce52013-03-27 23:08:40 +0000264 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000265
266 if (log)
267 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000268 static_cast<void*>(m_opaque),
269 static_cast<void*>(broadcaster.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000270
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271 return broadcaster;
272}
273
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000274const char *
275SBCommunication::GetBroadcasterClass ()
276{
277 return Communication::GetStaticBroadcasterClass().AsCString();
278}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000279
280//
281//void
282//SBCommunication::CreateIfNeeded ()
283//{
Greg Clayton66111032010-06-23 01:19:29 +0000284// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285// {
286// static uint32_t g_broadcaster_num;
287// char broadcaster_name[256];
288// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000289// m_opaque = new Communication (broadcaster_name);
290// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291// }
Greg Clayton66111032010-06-23 01:19:29 +0000292// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293//}
294//
295//