Home | History | Annotate | Download | only in driver
      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