]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/tools/driver/IOChannel.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / tools / driver / IOChannel.h
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_