124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Listener.h ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Select_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Select_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
195a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham#include <vector>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Predicate.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Listener
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class Broadcaster;
365a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    friend class BroadcasterManager;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Listener (const char *name);
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Listener ();
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AddEvent (lldb::EventSP &event);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear ();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham    const char *
52e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham    GetName ()
53e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham    {
54e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham        return m_name.c_str();
55e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham    }
56e9170d2ccd75c88691e9b85291a0042e58f982beJim Ingham
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
585a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    StartListeningForEventSpec (BroadcasterManager &manager,
595a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                 const BroadcastEventSpec &event_spec);
605a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
615a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    bool
625a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    StopListeningForEventSpec (BroadcasterManager &manager,
635a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                 const BroadcastEventSpec &event_spec);
645a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
655a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    uint32_t
665a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    StartListeningForEvents (Broadcaster* broadcaster,
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                             uint32_t event_mask);
685a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StartListeningForEvents (Broadcaster* broadcaster,
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                             uint32_t event_mask,
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                             HandleBroadcastCallback callback,
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                             void *callback_user_data);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StopListeningForEvents (Broadcaster* broadcaster,
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint32_t event_mask);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Returns true if an event was recieved, false if we timed out.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WaitForEvent (const TimeValue *timeout,
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  lldb::EventSP &event_sp);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WaitForEventForBroadcaster (const TimeValue *timeout,
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Broadcaster *broadcaster,
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb::EventSP &event_sp);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WaitForEventForBroadcasterWithType (const TimeValue *timeout,
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        Broadcaster *broadcaster,
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        uint32_t event_type_mask,
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        lldb::EventSP &event_sp);
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Event *
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PeekAtNextEvent ();
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Event *
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Event *
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           uint32_t event_type_mask);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNextEvent (lldb::EventSP &event_sp);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNextEventForBroadcaster (Broadcaster *broadcaster,
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb::EventSP &event_sp);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        uint32_t event_type_mask,
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        lldb::EventSP &event_sp);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    HandleBroadcastEvent (lldb::EventSP &event_sp);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1209e3193a5c84b26a97fffc61de0b20dfbcfa54393Jim Inghamprivate:
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Listener can see and modify these
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct BroadcasterInfo
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = NULL, void *ud = NULL) :
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            event_mask (mask),
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            callback (cb),
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            callback_user_data (ud)
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t event_mask;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        HandleBroadcastCallback callback;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void *callback_user_data;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::list<lldb::EventSP> event_collection;
1415a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    typedef std::vector<BroadcasterManager *> broadcaster_manager_collection;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           const ConstString *sources, // NULL for any event
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           uint32_t num_sources,
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           uint32_t event_type_mask,
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           lldb::EventSP &event_sp,
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           bool remove);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          const ConstString *sources, // NULL for any event
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          uint32_t num_sources,
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          uint32_t event_type_mask,
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          lldb::EventSP &event_sp);
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WaitForEventsInternal (const TimeValue *timeout,
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           Broadcaster *broadcaster,   // NULL for any broadcaster
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           const ConstString *sources, // NULL for any event
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           uint32_t num_sources,
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           uint32_t event_type_mask,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           lldb::EventSP &event_sp);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string m_name;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    broadcaster_collection m_broadcasters;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex m_broadcasters_mutex; // Protects m_broadcasters
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    event_collection m_events;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex m_events_mutex; // Protects m_broadcasters and m_events
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Predicate<bool> m_cond_wait;
1725a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    broadcaster_manager_collection m_broadcaster_managers;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BroadcasterWillDestruct (Broadcaster *);
1765a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
1775a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    void
1785a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    BroadcasterManagerWillDestruct (BroadcasterManager *manager);
1795a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    broadcaster_collection::iterator
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    FindBroadcasterWithMask (Broadcaster *broadcaster,
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                             uint32_t event_mask,
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                             bool exact);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For Listener only
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Listener);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Select_h_
195