1//===-- Communication.h -----------------------------------------*- 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#ifndef liblldb_Communication_h_
11#define liblldb_Communication_h_
12
13// C Includes
14// C++ Includes
15#include <string>
16
17// Other libraries and framework includes
18// Project includes
19#include "lldb/lldb-private.h"
20#include "lldb/Core/Broadcaster.h"
21#include "lldb/Core/Error.h"
22#include "lldb/Host/Mutex.h"
23#include "lldb/lldb-private.h"
24
25namespace lldb_private {
26
27//----------------------------------------------------------------------
28/// @class Communication Communication.h "lldb/Core/Communication.h"
29/// @brief An abstract communications class.
30///
31/// Communication is an class that handles data communication
32/// between two data sources. It uses a Connection class to do the
33/// real communication. This approach has a couple of advantages: it
34/// allows a single instance of this class to be used even though its
35/// connection can change. Connections could negotiate for different
36/// connections based on abilities like starting with Bluetooth and
37/// negotiating up to WiFi if available. It also allows this class to be
38/// subclassed by any interfaces that don't want to give bytes but want
39/// to validate and give out packets. This can be done by overriding:
40///
41/// AppendBytesToCache (const uint8_t *src, size_t src_len, bool broadcast);
42///
43/// Communication inherits from Broadcaster which means it can be
44/// used in conjunction with Listener to wait for multiple broadcaster
45/// objects and multiple events from each of those objects.
46/// Communication defines a set of pre-defined event bits (see
47/// enumerations definitions that start with "eBroadcastBit" below).
48///
49/// There are two modes in which communications can occur:
50///     @li single-threaded
51///     @li multi-threaded
52///
53/// In single-threaded mode, all reads and writes happen synchronously
54/// on the calling thread.
55///
56/// In multi-threaded mode, a read thread is spawned that continually
57/// reads data and caches any received bytes. To start the read thread
58/// clients call:
59///
60///     bool Communication::StartReadThread (Error *);
61///
62/// If true is returned a read thead has been spawned that will
63/// continually execute a call to the pure virtual DoRead function:
64///
65///     size_t Communication::ReadFromConnection (void *, size_t, uint32_t);
66///
67/// When bytes are received the data gets cached in \a m_bytes and this
68/// class will broadcast a \b eBroadcastBitReadThreadGotBytes event.
69/// Clients that want packet based communication should override
70/// AppendBytesToCache. The subclasses can choose to call the
71/// built in AppendBytesToCache with the \a broadcast parameter set to
72/// false. This will cause the \b eBroadcastBitReadThreadGotBytes event
73/// not get broadcast, and then the subclass can post a \b
74/// eBroadcastBitPacketAvailable event when a full packet of data has
75/// been received.
76///
77/// If the connection is disconnected a \b eBroadcastBitDisconnected
78/// event gets broadcast. If the read thread exits a \b
79/// eBroadcastBitReadThreadDidExit event will be broadcast. Clients
80/// can also post a \b eBroadcastBitReadThreadShouldExit event to this
81/// object which will cause the read thread to exit.
82//----------------------------------------------------------------------
83class Communication : public Broadcaster
84{
85public:
86    enum {
87        eBroadcastBitDisconnected           = (1 << 0), ///< Sent when the communications connection is lost.
88        eBroadcastBitReadThreadGotBytes     = (1 << 1), ///< Sent by the read thread when bytes become available.
89        eBroadcastBitReadThreadDidExit      = (1 << 2), ///< Sent by the read thread when it exits to inform clients.
90        eBroadcastBitReadThreadShouldExit   = (1 << 3), ///< Sent by clients that need to cancel the read thread.
91        eBroadcastBitPacketAvailable        = (1 << 4), ///< Sent when data received makes a complete packet.
92        kLoUserBroadcastBit                 = (1 << 16),///< Subclasses can used bits 31:16 for any needed events.
93        kHiUserBroadcastBit                 = (1 << 31),
94        eAllEventBits                       = 0xffffffff
95    };
96
97    typedef void (*ReadThreadBytesReceived) (void *baton, const void *src, size_t src_len);
98
99
100    //------------------------------------------------------------------
101    /// Construct the Communication object with the specified name for
102    /// the Broadcaster that this object inherits from.
103    ///
104    /// @param[in] broadcaster_name
105    ///     The name of the broadcaster object.  This name should be as
106    ///     complete as possible to uniquely identify this object. The
107    ///     broadcaster name can be updated after the connect function
108    ///     is called.
109    //------------------------------------------------------------------
110    Communication(const char * broadcaster_name);
111
112    //------------------------------------------------------------------
113    /// Destructor.
114    ///
115    /// The destructor is virtual since this class gets subclassed.
116    //------------------------------------------------------------------
117    virtual
118    ~Communication();
119
120    void
121    Clear ();
122
123    //------------------------------------------------------------------
124    /// Connect using the current connection by passing \a url to its
125    /// connect function.
126    /// string.
127    ///
128    /// @param[in] url
129    ///     A string that contains all information needed by the
130    ///     subclass to connect to another client.
131    ///
132    /// @return
133    ///     \b True if the connect succeeded, \b false otherwise. The
134    ///     internal error object should be filled in with an
135    ///     appropriate value based on the result of this function.
136    ///
137    /// @see Error& Communication::GetError ();
138    /// @see bool Connection::Connect (const char *url);
139    //------------------------------------------------------------------
140    lldb::ConnectionStatus
141    Connect (const char *url, Error *error_ptr);
142
143    //------------------------------------------------------------------
144    /// Disconnect the communications connection if one is currently
145    /// connected.
146    ///
147    /// @return
148    ///     \b True if the disconnect succeeded, \b false otherwise. The
149    ///     internal error object should be filled in with an
150    ///     appropriate value based on the result of this function.
151    ///
152    /// @see Error& Communication::GetError ();
153    /// @see bool Connection::Disconnect ();
154    //------------------------------------------------------------------
155    lldb::ConnectionStatus
156    Disconnect (Error *error_ptr = NULL);
157
158    //------------------------------------------------------------------
159    /// Check if the connection is valid.
160    ///
161    /// @return
162    ///     \b True if this object is currently connected, \b false
163    ///     otherwise.
164    //------------------------------------------------------------------
165    bool
166    IsConnected () const;
167
168    bool
169    HasConnection () const;
170
171    lldb_private::Connection *
172    GetConnection ()
173    {
174        return m_connection_sp.get();
175    }
176    //------------------------------------------------------------------
177    /// Read bytes from the current connection.
178    ///
179    /// If no read thread is running, this function call the
180    /// connection's Connection::Read(...) function to get any available.
181    ///
182    /// If a read thread has been started, this function will check for
183    /// any cached bytes that have already been read and return any
184    /// currently available bytes. If no bytes are cached, it will wait
185    /// for the bytes to become available by listening for the \a
186    /// eBroadcastBitReadThreadGotBytes event. If this function consumes
187    /// all of the bytes in the cache, it will reset the
188    /// \a eBroadcastBitReadThreadGotBytes event bit.
189    ///
190    /// @param[in] dst
191    ///     A destination buffer that must be at least \a dst_len bytes
192    ///     long.
193    ///
194    /// @param[in] dst_len
195    ///     The number of bytes to attempt to read, and also the max
196    ///     number of bytes that can be placed into \a dst.
197    ///
198    /// @param[in] timeout_usec
199    ///     A timeout value in micro-seconds.
200    ///
201    /// @return
202    ///     The number of bytes actually read.
203    ///
204    /// @see size_t Connection::Read (void *, size_t);
205    //------------------------------------------------------------------
206    size_t
207    Read (void *dst,
208          size_t dst_len,
209          uint32_t timeout_usec,
210          lldb::ConnectionStatus &status,
211          Error *error_ptr);
212
213    //------------------------------------------------------------------
214    /// The actual write function that attempts to write to the
215    /// communications protocol.
216    ///
217    /// Subclasses must override this function.
218    ///
219    /// @param[in] src
220    ///     A source buffer that must be at least \a src_len bytes
221    ///     long.
222    ///
223    /// @param[in] src_len
224    ///     The number of bytes to attempt to write, and also the
225    ///     number of bytes are currently available in \a src.
226    ///
227    /// @return
228    ///     The number of bytes actually Written.
229    //------------------------------------------------------------------
230    size_t
231    Write (const void *src,
232           size_t src_len,
233           lldb::ConnectionStatus &status,
234           Error *error_ptr);
235
236    //------------------------------------------------------------------
237    /// Sets the connection that it to be used by this class.
238    ///
239    /// By making a communication class that uses different connections
240    /// it allows a single communication interface to negotiate and
241    /// change its connection without any interruption to the client.
242    /// It also allows the Communication class to be subclassed for
243    /// packet based communication.
244    ///
245    /// @param[in] connection
246    ///     A connection that this class will own and destroy.
247    ///
248    /// @see
249    ///     class Connection
250    //------------------------------------------------------------------
251    void
252    SetConnection (Connection *connection);
253
254    //------------------------------------------------------------------
255    /// Starts a read thread whose sole purpose it to read bytes from
256    /// the current connection. This function will call connection's
257    /// read function:
258    ///
259    /// size_t Connection::Read (void *, size_t);
260    ///
261    /// When bytes are read and cached, this function will call:
262    ///
263    /// Communication::AppendBytesToCache (const uint8_t * bytes, size_t len, bool broadcast);
264    ///
265    /// Subclasses should override this function if they wish to override
266    /// the default action of caching the bytes and broadcasting a \b
267    /// eBroadcastBitReadThreadGotBytes event.
268    ///
269    /// @return
270    ///     \b True if the read thread was successfully started, \b
271    ///     false otherwise.
272    ///
273    /// @see size_t Connection::Read (void *, size_t);
274    /// @see void Communication::AppendBytesToCache (const uint8_t * bytes, size_t len, bool broadcast);
275    //------------------------------------------------------------------
276    virtual bool
277    StartReadThread (Error *error_ptr = NULL);
278
279    //------------------------------------------------------------------
280    /// Stops the read thread by cancelling it.
281    ///
282    /// @return
283    ///     \b True if the read thread was successfully canceled, \b
284    ///     false otherwise.
285    //------------------------------------------------------------------
286    virtual bool
287    StopReadThread (Error *error_ptr = NULL);
288
289    //------------------------------------------------------------------
290    /// Checks if there is a currently running read thread.
291    ///
292    /// @return
293    ///     \b True if the read thread is running, \b false otherwise.
294    //------------------------------------------------------------------
295    bool
296    ReadThreadIsRunning ();
297
298    //------------------------------------------------------------------
299    /// The static read thread function. This function will call
300    /// the "DoRead" function continuously and wait for data to become
301    /// avaialble. When data is received it will append the available
302    /// data to the internal cache and broadcast a
303    /// \b eBroadcastBitReadThreadGotBytes event.
304    ///
305    /// @param[in] comm_ptr
306    ///     A pointer to an instance of this class.
307    ///
308    /// @return
309    ///     \b NULL.
310    ///
311    /// @see void Communication::ReadThreadGotBytes (const uint8_t *, size_t);
312    //------------------------------------------------------------------
313    static lldb::thread_result_t
314    ReadThread (lldb::thread_arg_t comm_ptr);
315
316    void
317    SetReadThreadBytesReceivedCallback (ReadThreadBytesReceived callback,
318                                        void *callback_baton);
319
320    static const char *
321    ConnectionStatusAsCString (lldb::ConnectionStatus status);
322
323    bool
324    GetCloseOnEOF () const
325    {
326        return m_close_on_eof;
327    }
328
329    void
330    SetCloseOnEOF (bool b)
331    {
332        m_close_on_eof = b;
333    }
334
335    static ConstString &GetStaticBroadcasterClass ();
336
337    virtual ConstString &GetBroadcasterClass() const
338    {
339        return GetStaticBroadcasterClass();
340    }
341
342private:
343    //------------------------------------------------------------------
344    // For Communication only
345    //------------------------------------------------------------------
346    DISALLOW_COPY_AND_ASSIGN (Communication);
347
348
349protected:
350    lldb::ConnectionSP m_connection_sp; ///< The connection that is current in use by this communications class.
351    lldb::thread_t m_read_thread; ///< The read thread handle in case we need to cancel the thread.
352    bool m_read_thread_enabled;
353    std::string m_bytes;    ///< A buffer to cache bytes read in the ReadThread function.
354    Mutex m_bytes_mutex;    ///< A mutex to protect multi-threaded access to the cached bytes.
355    Mutex m_write_mutex;    ///< Don't let multiple threads write at the same time...
356    ReadThreadBytesReceived m_callback;
357    void *m_callback_baton;
358    bool m_close_on_eof;
359
360    size_t
361    ReadFromConnection (void *dst,
362                        size_t dst_len,
363                        uint32_t timeout_usec,
364                        lldb::ConnectionStatus &status,
365                        Error *error_ptr);
366    //------------------------------------------------------------------
367    /// Append new bytes that get read from the read thread into the
368    /// internal object byte cache. This will cause a \b
369    /// eBroadcastBitReadThreadGotBytes event to be broadcast if \a
370    /// broadcast is true.
371    ///
372    /// Subclasses can override this function in order to inspect the
373    /// received data and check if a packet is available.
374    ///
375    /// Subclasses can also still call this function from the
376    /// overridden method to allow the caching to correctly happen and
377    /// suppress the broadcasting of the \a eBroadcastBitReadThreadGotBytes
378    /// event by setting \a broadcast to false.
379    ///
380    /// @param[in] src
381    ///     A source buffer that must be at least \a src_len bytes
382    ///     long.
383    ///
384    /// @param[in] src_len
385    ///     The number of bytes to append to the cache.
386    //------------------------------------------------------------------
387    virtual void
388    AppendBytesToCache (const uint8_t *src, size_t src_len, bool broadcast, lldb::ConnectionStatus status);
389
390    //------------------------------------------------------------------
391    /// Get any available bytes from our data cache. If this call
392    /// empties the data cache, the \b eBroadcastBitReadThreadGotBytes event
393    /// will be reset to signify no more bytes are available.
394    ///
395    /// @param[in] dst
396    ///     A destination buffer that must be at least \a dst_len bytes
397    ///     long.
398    ///
399    /// @param[in] dst_len
400    ///     The number of bytes to attempt to read from the cache,
401    ///     and also the max number of bytes that can be placed into
402    ///     \a dst.
403    ///
404    /// @return
405    ///     The number of bytes extracted from the data cache.
406    //------------------------------------------------------------------
407    size_t
408    GetCachedBytes (void *dst, size_t dst_len);
409};
410
411} // namespace lldb_private
412
413#endif  // liblldb_Communication_h_
414