summaryrefslogtreecommitdiff
path: root/indra/newview/lleventpoll.cpp
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-01-18 13:15:32 -0500
committerNat Goodspeed <nat@lindenlab.com>2024-01-18 13:15:32 -0500
commitfea1d9f4d21ceccb6ebb13270c40ebbae737e769 (patch)
treec6e4fa3a9c1f0ff39e3a65e4694b3bb891d2812e /indra/newview/lleventpoll.cpp
parent5fa7f69101a889009194eeddb927599d7536613f (diff)
parentfe796dac711c7ecdc7d6d17e0b692abf468b754a (diff)
SL-20546: Merge branch 'DRTVWR-588-maint-W' into sl-20546.
Diffstat (limited to 'indra/newview/lleventpoll.cpp')
-rw-r--r--indra/newview/lleventpoll.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index 26782e53f0..6ffc8f7bdd 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -102,6 +102,7 @@ namespace Details
void LLEventPollImpl::handleMessage(const LLSD& content)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_APP;
std::string msg_name = content["message"];
LLSD message;
message["sender"] = mSenderIp;
@@ -149,6 +150,14 @@ namespace Details
mAdapter = httpAdapter;
+ LL::WorkQueue::ptr_t main_queue = nullptr;
+
+ // HACK -- grab the mainloop workqueue to move execution of the handler
+ // to a place that's safe in the main thread
+#if 1
+ main_queue = LL::WorkQueue::getInstance("mainloop");
+#endif
+
// continually poll for a server update until we've been flagged as
// finished
while (!mDone)
@@ -266,13 +275,26 @@ namespace Details
// was LL_INFOS() but now that CoarseRegionUpdate is TCP @ 1/second, it'd be too verbose for viewer logs. -MG
LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> " << events.size() << "events (id " << acknowledge << ")" << LL_ENDL;
+
LLSD::array_const_iterator i = events.beginArray();
LLSD::array_const_iterator end = events.endArray();
for (; i != end; ++i)
{
if (i->has("message"))
{
- handleMessage(*i);
+ if (main_queue)
+ { // shuttle to a sensible spot in the main thread instead
+ // of wherever this coroutine happens to be executing
+ const LLSD& msg = *i;
+ main_queue->post([this, msg]()
+ {
+ handleMessage(msg);
+ });
+ }
+ else
+ {
+ handleMessage(*i);
+ }
}
}
}