summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
authorRider Linden <rider@lindenlab.com>2015-12-17 14:09:51 -0800
committerRider Linden <rider@lindenlab.com>2015-12-17 14:09:51 -0800
commit2c9097aa28d65eeddcfb60b9ac93495723ed6419 (patch)
tree1e6ddd635bf2eee516628a563af200384c0b36ae /indra/llcommon
parentdb70768def60016daabaf25f38d516d6b72f77ce (diff)
MAINT-5977: Finish implementation of MailBox event pump type for guaranteed delivery
Diffstat (limited to 'indra/llcommon')
-rwxr-xr-xindra/llcommon/llevents.cpp21
-rwxr-xr-xindra/llcommon/llevents.h20
2 files changed, 27 insertions, 14 deletions
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 080830a134..fc2d8d5e23 100755
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -512,10 +512,11 @@ bool LLEventStream::post(const LLSD& event)
*****************************************************************************/
bool LLEventMailDrop::post(const LLSD& event)
{
- bool posted = LLEventPump::post(event);
+ bool posted = LLEventStream::post(event);
if (!posted)
- {
+ { // if the event was not handled we will save it for later so that it can
+ // be posted to any future listeners when they attach.
mEventHistory.push_back(event);
}
@@ -527,15 +528,17 @@ LLBoundListener LLEventMailDrop::listen_impl(const std::string& name,
const NameList& after,
const NameList& before)
{
- LLBoundListener bndlistener = LLEventPump::listen_impl(name, listener, after, before);
-
- return bndlistener;
-}
-
-// typedef std::list<LLSD> EventList;
-// EventList mEventHistory;
+ if (!mEventHistory.empty())
+ {
+ if (listener(mEventHistory.front()))
+ {
+ mEventHistory.pop_front();
+ }
+ }
+ return LLEventStream::listen_impl(name, listener, after, before);
+}
/*****************************************************************************
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index b07db889c0..6175329a9d 100755
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -508,7 +508,7 @@ public:
// at the boost::bind object itself before that happens.
return LLEventDetail::visit_and_connect(name,
listener,
- boost::bind(&LLEventPump::listen_impl,
+ boost::bind(&LLEventPump::listen_invoke,
this,
name,
_1,
@@ -553,7 +553,16 @@ private:
virtual void reset();
+
+
private:
+ LLBoundListener listen_invoke(const std::string& name, const LLEventListener& listener,
+ const NameList& after,
+ const NameList& before)
+ {
+ return this->listen_impl(name, listener, after, before);
+ }
+
std::string mName;
protected:
@@ -604,13 +613,14 @@ public:
/**
* LLEventMailDrop is a specialization of LLEventStream. Events are posted normally,
* however if no listeners return that they have handled the event it is placed in
- * a list. Subsequent attaching listeners will recieve stored events until a
- * listener indicates that the event has been handled.
+ * a queue. Subsequent attaching listeners will receive stored events from the queue
+ * until a listener indicates that the event has been handled. In order to receive
+ * multiple events from a mail drop the listener must disconnect and reconnect.
*/
-class LL_COMMON_API LLEventMailDrop: public LLEventPump
+class LL_COMMON_API LLEventMailDrop : public LLEventStream
{
public:
- LLEventMailDrop(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+ LLEventMailDrop(const std::string& name, bool tweak = false) : LLEventStream(name, tweak) {}
virtual ~LLEventMailDrop() {}
/// Post an event to all listeners