blob: e8129ce919f2ae7beb2dd1e3bc587a08d082f796 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- GDBRemoteCommunication.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_GDBRemoteCommunication_h_
11#define liblldb_GDBRemoteCommunication_h_
12
13// C Includes
14// C++ Includes
15#include <list>
16#include <string>
17
18// Other libraries and framework includes
19// Project includes
20#include "lldb/lldb-private.h"
Chris Lattner24943d22010-06-08 16:52:24 +000021#include "lldb/Core/Communication.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Listener.h"
23#include "lldb/Host/Mutex.h"
24#include "lldb/Host/Predicate.h"
25
Greg Clayton54e7afa2010-07-09 20:39:50 +000026#include "Utility/StringExtractorGDBRemote.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027
28class ProcessGDBRemote;
29
Greg Clayton61d043b2011-03-22 04:00:09 +000030class GDBRemoteCommunication : public lldb_private::Communication
Chris Lattner24943d22010-06-08 16:52:24 +000031{
32public:
Greg Claytonb749a262010-12-03 06:02:24 +000033 enum
34 {
35 eBroadcastBitRunPacketSent = kLoUserBroadcastBit
36 };
Chris Lattner24943d22010-06-08 16:52:24 +000037 //------------------------------------------------------------------
38 // Constructors and Destructors
39 //------------------------------------------------------------------
Greg Clayton61d043b2011-03-22 04:00:09 +000040 GDBRemoteCommunication(const char *comm_name, const char *listener_name);
Chris Lattner24943d22010-06-08 16:52:24 +000041
42 virtual
43 ~GDBRemoteCommunication();
44
45 size_t
46 SendPacket (const char *payload);
47
48 size_t
49 SendPacket (const char *payload,
50 size_t payload_length);
51
Chris Lattner24943d22010-06-08 16:52:24 +000052 // Wait for a packet within 'nsec' seconds
53 size_t
54 WaitForPacket (StringExtractorGDBRemote &response,
Greg Claytonc97bfdb2011-03-10 02:26:48 +000055 uint32_t sec);
Chris Lattner24943d22010-06-08 16:52:24 +000056
57 // Wait for a packet with an absolute timeout time. If 'timeout' is NULL
58 // wait indefinitely.
59 size_t
60 WaitForPacket (StringExtractorGDBRemote &response,
Greg Clayton72e1c782011-01-22 23:43:18 +000061 const lldb_private::TimeValue* timeout);
Chris Lattner24943d22010-06-08 16:52:24 +000062
63 char
Greg Claytonc97bfdb2011-03-10 02:26:48 +000064 GetAck ();
Chris Lattner24943d22010-06-08 16:52:24 +000065
66 size_t
Greg Claytona4881d02011-01-22 07:12:45 +000067 SendAck ();
68
69 size_t
70 SendNack ();
71
Chris Lattner24943d22010-06-08 16:52:24 +000072 char
73 CalculcateChecksum (const char *payload,
74 size_t payload_length);
75
Chris Lattner24943d22010-06-08 16:52:24 +000076 bool
Chris Lattner24943d22010-06-08 16:52:24 +000077 GetSequenceMutex(lldb_private::Mutex::Locker& locker);
78
79 //------------------------------------------------------------------
80 // Communication overrides
81 //------------------------------------------------------------------
82 virtual void
Caroline Ticec4f55fe2010-11-19 20:47:54 +000083 AppendBytesToCache (const uint8_t *src, size_t src_len, bool broadcast, lldb::ConnectionStatus status);
Chris Lattner24943d22010-06-08 16:52:24 +000084
Chris Lattner24943d22010-06-08 16:52:24 +000085 bool
86 IsRunning() const
87 {
Greg Claytoncecf3482011-01-20 07:53:45 +000088 return m_public_is_running.GetValue();
Chris Lattner24943d22010-06-08 16:52:24 +000089 }
Greg Clayton72e1c782011-01-22 23:43:18 +000090
Greg Clayton58e26e02011-03-24 04:28:38 +000091 bool
92 GetSendAcks ()
93 {
94 return m_send_acks;
95 }
96
Greg Clayton61d043b2011-03-22 04:00:09 +000097 //------------------------------------------------------------------
98 // Client and server must implement these pure virtual functions
99 //------------------------------------------------------------------
100 virtual bool
101 GetThreadSuffixSupported () = 0;
Chris Lattner24943d22010-06-08 16:52:24 +0000102
Greg Clayton61d043b2011-03-22 04:00:09 +0000103 //------------------------------------------------------------------
104 // Set the global packet timeout.
105 //
106 // For clients, this is the timeout that gets used when sending
107 // packets and waiting for responses. For servers, this might not
108 // get used, and if it doesn't this should be moved to the
109 // GDBRemoteCommunicationClient.
110 //------------------------------------------------------------------
Greg Claytonc97bfdb2011-03-10 02:26:48 +0000111 uint32_t
112 SetPacketTimeout (uint32_t packet_timeout)
113 {
114 const uint32_t old_packet_timeout = m_packet_timeout;
115 m_packet_timeout = packet_timeout;
116 return old_packet_timeout;
117 }
Greg Claytonc1f45872011-02-12 06:28:37 +0000118
Chris Lattner24943d22010-06-08 16:52:24 +0000119protected:
120 typedef std::list<std::string> packet_collection;
121
122 size_t
123 SendPacketNoLock (const char *payload,
124 size_t payload_length);
125
126 size_t
127 WaitForPacketNoLock (StringExtractorGDBRemote &response,
Greg Clayton72e1c782011-01-22 23:43:18 +0000128 const lldb_private::TimeValue* timeout_ptr);
129
130 bool
131 WaitForNotRunningPrivate (const lldb_private::TimeValue *timeout_ptr);
Chris Lattner24943d22010-06-08 16:52:24 +0000132
133 //------------------------------------------------------------------
134 // Classes that inherit from GDBRemoteCommunication can see and modify these
135 //------------------------------------------------------------------
Greg Claytonc97bfdb2011-03-10 02:26:48 +0000136 uint32_t m_packet_timeout;
Chris Lattner24943d22010-06-08 16:52:24 +0000137 lldb_private::Listener m_rx_packet_listener;
138 lldb_private::Mutex m_sequence_mutex; // Restrict access to sending/receiving packets to a single thread at a time
Greg Claytoncecf3482011-01-20 07:53:45 +0000139 lldb_private::Predicate<bool> m_public_is_running;
140 lldb_private::Predicate<bool> m_private_is_running;
Greg Clayton58e26e02011-03-24 04:28:38 +0000141 bool m_send_acks;
142
143
144
Chris Lattner24943d22010-06-08 16:52:24 +0000145
Chris Lattner24943d22010-06-08 16:52:24 +0000146private:
147 //------------------------------------------------------------------
148 // For GDBRemoteCommunication only
149 //------------------------------------------------------------------
150 DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunication);
151};
152
153#endif // liblldb_GDBRemoteCommunication_h_