• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- IOChannel.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 lldb_IOChannel_h_
11 #define lldb_IOChannel_h_
12 
13 #include <string>
14 #include <queue>
15 
16 #if defined(__FreeBSD__)
17 #include <readline/readline.h>
18 #else
19 #include <editline/readline.h>
20 #endif
21 #include <histedit.h>
22 #include <pthread.h>
23 #include <sys/time.h>
24 
25 #include "Driver.h"
26 
27 class IOChannel : public lldb::SBBroadcaster
28 {
29 public:
30     enum {
31         eBroadcastBitHasUserInput     = (1 << 0),
32         eBroadcastBitUserInterrupt    = (1 << 1),
33         eBroadcastBitThreadShouldExit = (1 << 2),
34         eBroadcastBitThreadDidExit    = (1 << 3),
35         eBroadcastBitThreadDidStart   = (1 << 4),
36         eBroadcastBitsSTDOUT          = (1 << 5),
37         eBroadcastBitsSTDERR          = (1 << 6),
38         eBroadcastBitsSTDIN           = (1 << 7),
39         eAllEventBits                 = 0xffffffff
40     };
41 
42     enum LibeditGetInputResult
43     {
44         eLibeditGetInputEOF = 0,
45         eLibeditGetInputValid = 1,
46         eLibeditGetInputEmpty = 2,
47         eLibeditGetInputResultError = 4,
48         eLibeditGetInputResultUnknown = 0xffffffff
49     };
50 
51     IOChannel (FILE *editline_in,
52                FILE *editline_out,
53                FILE *out,
54                FILE *err,
55                Driver *driver = NULL);
56 
57     virtual
58     ~IOChannel ();
59 
60     bool
61     Start ();
62 
63     bool
64     Stop ();
65 
66     static void *
67     IOReadThread (void *);
68 
69     void
70     Run ();
71 
72     void
73     OutWrite (const char *buffer, size_t len, bool asynchronous);
74 
75     void
76     ErrWrite (const char *buffer, size_t len, bool asynchronous);
77 
78     LibeditGetInputResult
79     LibeditGetInput (std::string &);
80 
81     static void
82     LibeditOutputBytesReceived (void *baton, const void *src,size_t src_len);
83 
84     void
85     SetPrompt ();
86 
87     void
88     RefreshPrompt ();
89 
90     void
91     AddCommandToQueue (const char *command);
92 
93     bool
94     GetCommandFromQueue (std::string &cmd);
95 
96     int
97     CommandQueueSize () const;
98 
99     void
100     ClearCommandQueue ();
101 
102     bool
103     CommandQueueIsEmpty () const;
104 
105     const char *
106     GetPrompt ();
107 
108     bool
109     EditLineHasCharacters ();
110 
111     void
112     EraseCharsBeforeCursor ();
113 
114     static unsigned char
115     ElCompletionFn (EditLine *e, int ch);
116 
117     void
118     ElResize();
119 
120 protected:
121 
122     bool
123     IsGettingCommand () const;
124 
125     void
126     SetGettingCommand (bool new_value);
127 
128 private:
129 
130     pthread_mutex_t m_output_mutex;
131     struct timeval m_enter_elgets_time;
132 
133     Driver *m_driver;
134     lldb::thread_t m_read_thread;
135     bool m_read_thread_should_exit;
136     FILE *m_out_file;
137     FILE *m_err_file;
138     std::queue<std::string> m_command_queue;
139     const char *m_completion_key;
140 
141     EditLine *m_edit_line;
142     History *m_history;
143     HistEvent m_history_event;
144     bool m_getting_command;
145     bool m_expecting_prompt;
146 	std::string m_prompt_str;  // for accumlating the prompt as it gets written out by editline
147     bool m_refresh_request_pending;
148 
149     void
150     HistorySaveLoad (bool save);
151 
152     unsigned char
153     HandleCompletion (EditLine *e, int ch);
154 };
155 
156 class IOLocker
157 {
158 public:
159 
160     IOLocker (pthread_mutex_t &mutex);
161 
162     ~IOLocker ();
163 
164 protected:
165 
166     pthread_mutex_t *m_mutex_ptr;
167 
168 private:
169 
170     IOLocker (const IOLocker&);
171     const IOLocker& operator= (const IOLocker&);
172 };
173 
174 #endif  // lldb_IOChannel_h_
175