#ifndef liblldb_Select_h_
#define liblldb_Select_h_
#include <list>
#include <map>
#include <set>
#include <string>
#include "lldb/lldb-private.h"
#include "lldb/Host/Predicate.h"
#include "lldb/Core/Event.h"
namespace lldb_private {
class Listener
{
public:
typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
friend class Broadcaster;
Listener (const char *name);
~Listener ();
void
AddEvent (lldb::EventSP &event);
void
Clear ();
const char *
GetName ()
{
return m_name.c_str();
}
uint32_t
StartListeningForEvents (Broadcaster* broadcaster,
uint32_t event_mask);
uint32_t
StartListeningForEvents (Broadcaster* broadcaster,
uint32_t event_mask,
HandleBroadcastCallback callback,
void *callback_user_data);
bool
StopListeningForEvents (Broadcaster* broadcaster,
uint32_t event_mask);
bool
WaitForEvent (const TimeValue *timeout,
lldb::EventSP &event_sp);
bool
WaitForEventForBroadcaster (const TimeValue *timeout,
Broadcaster *broadcaster,
lldb::EventSP &event_sp);
bool
WaitForEventForBroadcasterWithType (const TimeValue *timeout,
Broadcaster *broadcaster,
uint32_t event_type_mask,
lldb::EventSP &event_sp);
Event *
PeekAtNextEvent ();
Event *
PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
Event *
PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
uint32_t event_type_mask);
bool
GetNextEvent (lldb::EventSP &event_sp);
bool
GetNextEventForBroadcaster (Broadcaster *broadcaster,
lldb::EventSP &event_sp);
bool
GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
uint32_t event_type_mask,
lldb::EventSP &event_sp);
size_t
HandleBroadcastEvent (lldb::EventSP &event_sp);
protected:
struct BroadcasterInfo
{
BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = NULL, void *ud = NULL) :
event_mask (mask),
callback (cb),
callback_user_data (ud)
{
}
uint32_t event_mask;
HandleBroadcastCallback callback;
void *callback_user_data;
};
typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
typedef std::list<lldb::EventSP> event_collection;
bool
FindNextEventInternal (Broadcaster *broadcaster, const ConstString *sources, uint32_t num_sources,
uint32_t event_type_mask,
lldb::EventSP &event_sp,
bool remove);
bool
GetNextEventInternal (Broadcaster *broadcaster, const ConstString *sources, uint32_t num_sources,
uint32_t event_type_mask,
lldb::EventSP &event_sp);
bool
WaitForEventsInternal (const TimeValue *timeout,
Broadcaster *broadcaster, const ConstString *sources, uint32_t num_sources,
uint32_t event_type_mask,
lldb::EventSP &event_sp);
std::string m_name;
broadcaster_collection m_broadcasters;
Mutex m_broadcasters_mutex; event_collection m_events;
Mutex m_events_mutex; Predicate<bool> m_cond_wait;
void
BroadcasterWillDestruct (Broadcaster *);
private:
DISALLOW_COPY_AND_ASSIGN (Listener);
};
}
#endif // liblldb_Select_h_