From 3aeff074cfc2f14b661b96bc0664087a95a99eff Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 26 Oct 2012 18:27:08 -0400
Subject: SH-3469 FIX - use callback mechanism to handle possible race between
 getting caps and setting agent region

---
 indra/newview/llagent.cpp         | 23 +++++++++++++++++++----
 indra/newview/llagent.h           |  1 +
 indra/newview/llappearancemgr.cpp |  4 ++++
 3 files changed, 24 insertions(+), 4 deletions(-)
 mode change 100644 => 100755 indra/newview/llagent.h

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 9eb2723dcf..c49caf93be 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -809,6 +809,18 @@ void LLAgent::standUp()
 }
 
 
+void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id)
+{
+	llinfos << "called" << llendl;
+
+	if (isAgentAvatarValid() &&
+		!gAgentAvatarp->isUsingServerBakes() &&
+		(mRegionp->getCentralBakeVersion()>0))
+	{
+		LLAppearanceMgr::instance().requestServerAppearanceUpdate();
+	}
+}
+
 //-----------------------------------------------------------------------------
 // setRegion()
 //-----------------------------------------------------------------------------
@@ -908,11 +920,14 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
 	// If the newly entered region is using server bakes, and our
 	// current appearance is non-baked, request appearance update from
 	// server.
-	if (isAgentAvatarValid() &&
-		!gAgentAvatarp->isUsingServerBakes() &&
-		(mRegionp->getCentralBakeVersion()>0))
+	if (mRegionp->capabilitiesReceived())
 	{
-		LLAppearanceMgr::instance().requestServerAppearanceUpdate();
+		handleServerBakeRegionTransition(mRegionp->getRegionID());
+	}
+	else
+	{
+		// Need to handle via callback after caps arrive.
+		mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1));
 	}
 }
 
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
old mode 100644
new mode 100755
index ae5efb2287..693c123851
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -610,6 +610,7 @@ private:
 
 	void            handleTeleportFinished();
 	void            handleTeleportFailed();
+	void			handleServerBakeRegionTransition(const LLUUID& region_id);
 
 	//--------------------------------------------------------------------
 	// Teleport State
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c57269d0b0..7a8586ebdc 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2677,6 +2677,10 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
 	{
 		llwarns << "Region not set, cannot request server appearance update" << llendl;
 	}
+	if (gAgent.getRegion()->getCentralBakeVersion()==0)
+	{
+		llwarns << "Region does not support baking" << llendl;
+	}
 	std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance");	
 	if (url.empty())
 	{
-- 
cgit v1.2.3