blob: 9ac65087b26acfffe253d950d747a1b54dfec20b [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)
Caroline Tice61ba7ec2010-10-26 23:49:36 +000034 log->Printf ("SBCommunication::SBCommunication (broadcaster_name='%s') => "
35 "this.obj = %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
Caroline Tice61ba7ec2010-10-26 23:49:36 +000087 //if (log)
88 // log->Printf ("SBCommunication::AdoptFileDescriptor (this=%p, fd='%d', owns_fd='%s')", this, fd,
89 // (owns_fd ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +000090
Greg Clayton63094e02010-06-23 01:19:29 +000091 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000092 {
Greg Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque->HasConnection ())
Chris Lattner24943d22010-06-08 16:52:24 +000094 {
Greg Clayton63094e02010-06-23 01:19:29 +000095 if (m_opaque->IsConnected())
Caroline Tice7826c882010-10-26 03:11:13 +000096 m_opaque->Disconnect();
Chris Lattner24943d22010-06-08 16:52:24 +000097 }
Greg Clayton63094e02010-06-23 01:19:29 +000098 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
99 if (m_opaque->IsConnected())
Caroline Tice7826c882010-10-26 03:11:13 +0000100 {
101 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000102 log->Printf ("SBCommunication::AdoptFileDescriptor (this.obj=%p, fd=%d, ownd_fd='%s') "
103 "=> eConnectionStatusSuccess", m_opaque, fd, (owns_fd ? "true" : "false"));
Chris Lattner24943d22010-06-08 16:52:24 +0000104 return eConnectionStatusSuccess;
Caroline Tice7826c882010-10-26 03:11:13 +0000105 }
Chris Lattner24943d22010-06-08 16:52:24 +0000106 else
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000107 {
Caroline Tice7826c882010-10-26 03:11:13 +0000108 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000109 log->Printf ("SBCommunication::AdoptFileDescriptor (this.obj=%p, fd=%d, ownd_fd='%s') "
110 "=> eConnectionStatusLostConnection", m_opaque, fd, (owns_fd ? "true" : "false"));
Chris Lattner24943d22010-06-08 16:52:24 +0000111 return eConnectionStatusLostConnection;
Caroline Tice7826c882010-10-26 03:11:13 +0000112 }
Chris Lattner24943d22010-06-08 16:52:24 +0000113 }
Caroline Tice7826c882010-10-26 03:11:13 +0000114
115 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000116 log->Printf ("SBCommunication::AdoptFileDescriptor (this,obj=%p, fd=%d, ownd_fd='%s') "
117 "=> eConnectionStatusNoConnection", m_opaque, fd, (owns_fd ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000118
Chris Lattner24943d22010-06-08 16:52:24 +0000119 return eConnectionStatusNoConnection;
120}
121
122
123ConnectionStatus
124SBCommunication::Disconnect ()
125{
Caroline Tice7826c882010-10-26 03:11:13 +0000126 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
127
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000128 //if (log)
129 // log->Printf ("SBCommunication::Disconnect ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000130
131 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton63094e02010-06-23 01:19:29 +0000132 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000133 status = m_opaque->Disconnect ();
134
135 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000136 log->Printf ("SBCommunication::Disconnect (this.obj=%p) => '%s'", m_opaque,
137 Communication::ConnectionStatusAsCString (status));
Caroline Tice7826c882010-10-26 03:11:13 +0000138
139 return status;
Chris Lattner24943d22010-06-08 16:52:24 +0000140}
141
142bool
143SBCommunication::IsConnected () const
144{
Greg Clayton63094e02010-06-23 01:19:29 +0000145 if (m_opaque)
146 return m_opaque->IsConnected ();
Chris Lattner24943d22010-06-08 16:52:24 +0000147 return false;
148}
149
150size_t
151SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
152{
Greg Clayton63094e02010-06-23 01:19:29 +0000153 if (m_opaque)
154 return m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000155 status = eConnectionStatusNoConnection;
156 return 0;
157}
158
159
160size_t
161SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
162{
Greg Clayton63094e02010-06-23 01:19:29 +0000163 if (m_opaque)
164 return m_opaque->Write (src, src_len, status, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000165 status = eConnectionStatusNoConnection;
166 return 0;
167}
168
169bool
170SBCommunication::ReadThreadStart ()
171{
Caroline Tice7826c882010-10-26 03:11:13 +0000172 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
173
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000174 //if (log)
175 // log->Printf ("SBCommunication::ReadThreadStart ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000176
177 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000178 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000179 success = m_opaque->StartReadThread ();
180
181 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000182 log->Printf ("SBCommunication::ReadThreadStart (this.obj=%p) => '%s'", m_opaque, (success ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000183
184 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000185}
186
187
188bool
189SBCommunication::ReadThreadStop ()
190{
Caroline Tice7826c882010-10-26 03:11:13 +0000191 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
192
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000193 //if (log)
194 // log->Printf ("SBCommunication::ReadThreadStop ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000195
196 bool success = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000197 if (m_opaque)
Caroline Tice7826c882010-10-26 03:11:13 +0000198 success = m_opaque->StopReadThread ();
199
200 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000201 log->Printf ("SBCommunication::ReadThreadStop (this.obj=%p) => '%s'", m_opaque, (success ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000202
203 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000204}
205
206bool
207SBCommunication::ReadThreadIsRunning ()
208{
Greg Clayton63094e02010-06-23 01:19:29 +0000209 if (m_opaque)
210 return m_opaque->ReadThreadIsRunning ();
Chris Lattner24943d22010-06-08 16:52:24 +0000211 return false;
212}
213
214bool
215SBCommunication::SetReadThreadBytesReceivedCallback
216(
217 ReadThreadBytesReceived callback,
218 void *callback_baton
219)
220{
Caroline Tice7826c882010-10-26 03:11:13 +0000221 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
222
223 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000224 log->Printf ("SBCommunication::SetReadThreadBytesReceivedCallback (this.obj=%p, callback=%p, baton=%p)",
225 m_opaque, callback, callback_baton);
Caroline Tice7826c882010-10-26 03:11:13 +0000226
Greg Clayton63094e02010-06-23 01:19:29 +0000227 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000228 {
Greg Clayton63094e02010-06-23 01:19:29 +0000229 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Caroline Tice7826c882010-10-26 03:11:13 +0000230 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000231 log->Printf ("SBCommunication::SetReaDThreadBytesReceivedCallback (this.obj=%p...) => true", m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000232 return true;
233 }
Caroline Tice7826c882010-10-26 03:11:13 +0000234
235 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000236 log->Printf ("SBCommunication::SetReaDThreadBytesReceivedCallback (this.obj=%p...) => false", m_opaque);
Caroline Tice7826c882010-10-26 03:11:13 +0000237
Chris Lattner24943d22010-06-08 16:52:24 +0000238 return false;
239}
240
241SBBroadcaster
242SBCommunication::GetBroadcaster ()
243{
Greg Clayton63094e02010-06-23 01:19:29 +0000244 SBBroadcaster broadcaster (m_opaque, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000245 return broadcaster;
246}
247
248
249//
250//void
251//SBCommunication::CreateIfNeeded ()
252//{
Greg Clayton63094e02010-06-23 01:19:29 +0000253// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000254// {
255// static uint32_t g_broadcaster_num;
256// char broadcaster_name[256];
257// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000258// m_opaque = new Communication (broadcaster_name);
259// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000260// }
Greg Clayton63094e02010-06-23 01:19:29 +0000261// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000262//}
263//
264//