1 //===-- 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" 14 #include "lldb/Core/Log.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 20 21 SBCommunication::SBCommunication() : 22 m_opaque (NULL), 23 m_opaque_owned (false) 24 { 25 } 26 27 SBCommunication::SBCommunication(const char * broadcaster_name) : 28 m_opaque (new Communication (broadcaster_name)), 29 m_opaque_owned (true) 30 { 31 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32 33 if (log) 34 log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => " 35 "SBCommunication(%p)", broadcaster_name, m_opaque); 36 } 37 38 SBCommunication::~SBCommunication() 39 { 40 if (m_opaque && m_opaque_owned) 41 delete m_opaque; 42 m_opaque = NULL; 43 m_opaque_owned = false; 44 } 45 46 bool 47 SBCommunication::IsValid () const 48 { 49 return m_opaque != NULL; 50 } 51 52 bool 53 SBCommunication::GetCloseOnEOF () 54 { 55 if (m_opaque) 56 return m_opaque->GetCloseOnEOF (); 57 return false; 58 } 59 60 void 61 SBCommunication::SetCloseOnEOF (bool b) 62 { 63 if (m_opaque) 64 m_opaque->SetCloseOnEOF (b); 65 } 66 67 ConnectionStatus 68 SBCommunication::Connect (const char *url) 69 { 70 if (m_opaque) 71 { 72 if (!m_opaque->HasConnection ()) 73 m_opaque->SetConnection (new ConnectionFileDescriptor()); 74 return m_opaque->Connect (url, NULL); 75 } 76 return eConnectionStatusNoConnection; 77 } 78 79 ConnectionStatus 80 SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd) 81 { 82 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 83 84 ConnectionStatus status = eConnectionStatusNoConnection; 85 if (m_opaque) 86 { 87 if (m_opaque->HasConnection ()) 88 { 89 if (m_opaque->IsConnected()) 90 m_opaque->Disconnect(); 91 } 92 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd)); 93 if (m_opaque->IsConnected()) 94 status = eConnectionStatusSuccess; 95 else 96 status = eConnectionStatusLostConnection; 97 } 98 99 if (log) 100 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s", 101 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status)); 102 103 return status; 104 } 105 106 107 ConnectionStatus 108 SBCommunication::Disconnect () 109 { 110 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 111 112 ConnectionStatus status= eConnectionStatusNoConnection; 113 if (m_opaque) 114 status = m_opaque->Disconnect (); 115 116 if (log) 117 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque, 118 Communication::ConnectionStatusAsCString (status)); 119 120 return status; 121 } 122 123 bool 124 SBCommunication::IsConnected () const 125 { 126 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 127 bool result = false; 128 if (m_opaque) 129 result = m_opaque->IsConnected (); 130 131 if (log) 132 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result); 133 134 return false; 135 } 136 137 size_t 138 SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status) 139 { 140 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 141 if (log) 142 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status)...", 143 m_opaque, dst, dst_len, timeout_usec); 144 size_t bytes_read = 0; 145 if (m_opaque) 146 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL); 147 else 148 status = eConnectionStatusNoConnection; 149 150 if (log) 151 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%zu, timeout_usec=%u, &status=%s) => %zu", 152 m_opaque, dst, dst_len, timeout_usec, Communication::ConnectionStatusAsCString (status), 153 bytes_read); 154 return bytes_read; 155 } 156 157 158 size_t 159 SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status) 160 { 161 size_t bytes_written = 0; 162 if (m_opaque) 163 bytes_written = m_opaque->Write (src, src_len, status, NULL); 164 else 165 status = eConnectionStatusNoConnection; 166 167 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 168 if (log) 169 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%zu, &status=%s) => %zu", 170 m_opaque, src, src_len, Communication::ConnectionStatusAsCString (status), bytes_written); 171 172 return 0; 173 } 174 175 bool 176 SBCommunication::ReadThreadStart () 177 { 178 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 179 180 bool success = false; 181 if (m_opaque) 182 success = m_opaque->StartReadThread (); 183 184 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 185 if (log) 186 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success); 187 188 return success; 189 } 190 191 192 bool 193 SBCommunication::ReadThreadStop () 194 { 195 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 196 if (log) 197 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque); 198 199 bool success = false; 200 if (m_opaque) 201 success = m_opaque->StopReadThread (); 202 203 if (log) 204 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success); 205 206 return success; 207 } 208 209 bool 210 SBCommunication::ReadThreadIsRunning () 211 { 212 bool result = false; 213 if (m_opaque) 214 result = m_opaque->ReadThreadIsRunning (); 215 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 216 if (log) 217 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result); 218 return result; 219 } 220 221 bool 222 SBCommunication::SetReadThreadBytesReceivedCallback 223 ( 224 ReadThreadBytesReceived callback, 225 void *callback_baton 226 ) 227 { 228 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 229 230 bool result = false; 231 if (m_opaque) 232 { 233 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton); 234 result = true; 235 } 236 237 if (log) 238 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i", 239 m_opaque, callback, callback_baton, result); 240 241 return result; 242 } 243 244 SBBroadcaster 245 SBCommunication::GetBroadcaster () 246 { 247 SBBroadcaster broadcaster (m_opaque, false); 248 249 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 250 251 if (log) 252 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)", 253 m_opaque, broadcaster.get()); 254 255 return broadcaster; 256 } 257 258 259 // 260 //void 261 //SBCommunication::CreateIfNeeded () 262 //{ 263 // if (m_opaque == NULL) 264 // { 265 // static uint32_t g_broadcaster_num; 266 // char broadcaster_name[256]; 267 // ::snprintf (name, broadcaster_name, "%p SBCommunication", this); 268 // m_opaque = new Communication (broadcaster_name); 269 // m_opaque_owned = true; 270 // } 271 // assert (m_opaque); 272 //} 273 // 274 // 275