Listener.h revision e9170d2ccd75c88691e9b85291a0042e58f982be
1//===-- Listener.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_Select_h_
11#define liblldb_Select_h_
12
13// C Includes
14// C++ Includes
15#include <list>
16#include <map>
17#include <set>
18#include <string>
19
20
21// Other libraries and framework includes
22// Project includes
23#include "lldb/lldb-private.h"
24#include "lldb/Host/Predicate.h"
25#include "lldb/Core/Event.h"
26
27namespace lldb_private {
28
29class Listener
30{
31public:
32    typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
33
34    friend class Broadcaster;
35
36    //------------------------------------------------------------------
37    // Constructors and Destructors
38    //------------------------------------------------------------------
39    Listener (const char *name);
40
41    ~Listener ();
42
43    void
44    AddEvent (lldb::EventSP &event);
45
46    void
47    Clear ();
48
49    const char *
50    GetName ()
51    {
52        return m_name.c_str();
53    }
54
55    uint32_t
56    StartListeningForEvents (Broadcaster* broadcaster,
57                             uint32_t event_mask);
58
59    uint32_t
60    StartListeningForEvents (Broadcaster* broadcaster,
61                             uint32_t event_mask,
62                             HandleBroadcastCallback callback,
63                             void *callback_user_data);
64
65    bool
66    StopListeningForEvents (Broadcaster* broadcaster,
67                            uint32_t event_mask);
68
69    // Returns true if an event was recieved, false if we timed out.
70    bool
71    WaitForEvent (const TimeValue *timeout,
72                  lldb::EventSP &event_sp);
73
74    bool
75    WaitForEventForBroadcaster (const TimeValue *timeout,
76                                Broadcaster *broadcaster,
77                                lldb::EventSP &event_sp);
78
79    bool
80    WaitForEventForBroadcasterWithType (const TimeValue *timeout,
81                                        Broadcaster *broadcaster,
82                                        uint32_t event_type_mask,
83                                        lldb::EventSP &event_sp);
84
85    Event *
86    PeekAtNextEvent ();
87
88    Event *
89    PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
90
91    Event *
92    PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
93                                           uint32_t event_type_mask);
94
95    bool
96    GetNextEvent (lldb::EventSP &event_sp);
97
98    bool
99    GetNextEventForBroadcaster (Broadcaster *broadcaster,
100                                lldb::EventSP &event_sp);
101
102    bool
103    GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
104                                        uint32_t event_type_mask,
105                                        lldb::EventSP &event_sp);
106
107    size_t
108    HandleBroadcastEvent (lldb::EventSP &event_sp);
109
110protected:
111
112    //------------------------------------------------------------------
113    // Classes that inherit from Listener can see and modify these
114    //------------------------------------------------------------------
115    struct BroadcasterInfo
116    {
117        BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = NULL, void *ud = NULL) :
118            event_mask (mask),
119            callback (cb),
120            callback_user_data (ud)
121        {
122        }
123
124        uint32_t event_mask;
125        HandleBroadcastCallback callback;
126        void *callback_user_data;
127    };
128
129    typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
130    typedef std::list<lldb::EventSP> event_collection;
131
132    bool
133    FindNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
134                           const ConstString *sources, // NULL for any event
135                           uint32_t num_sources,
136                           uint32_t event_type_mask,
137                           lldb::EventSP &event_sp,
138                           bool remove);
139
140    bool
141    GetNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
142                          const ConstString *sources, // NULL for any event
143                          uint32_t num_sources,
144                          uint32_t event_type_mask,
145                          lldb::EventSP &event_sp);
146
147    bool
148    WaitForEventsInternal (const TimeValue *timeout,
149                           Broadcaster *broadcaster,   // NULL for any broadcaster
150                           const ConstString *sources, // NULL for any event
151                           uint32_t num_sources,
152                           uint32_t event_type_mask,
153                           lldb::EventSP &event_sp);
154
155    std::string m_name;
156    broadcaster_collection m_broadcasters;
157    Mutex m_broadcasters_mutex; // Protects m_broadcasters
158    event_collection m_events;
159    Mutex m_events_mutex; // Protects m_broadcasters and m_events
160    Predicate<bool> m_cond_wait;
161
162    void
163    BroadcasterWillDestruct (Broadcaster *);
164private:
165
166//    broadcaster_collection::iterator
167//    FindBroadcasterWithMask (Broadcaster *broadcaster,
168//                             uint32_t event_mask,
169//                             bool exact);
170
171    //------------------------------------------------------------------
172    // For Listener only
173    //------------------------------------------------------------------
174    DISALLOW_COPY_AND_ASSIGN (Listener);
175};
176
177} // namespace lldb_private
178
179#endif  // liblldb_Select_h_
180