Merged in lindenlab/viewer-bear

AndreyL ProductEngine 2016-04-14 23:17:53 +03:00
commit 46a34fe0ee
6 changed files with 123 additions and 62 deletions

View File

@ -1034,7 +1034,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val = (kdu_int32)(sp->fval*scale16);
val = (val+128)>>8; // May be faster than true rounding
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 255);
}
@ -1052,7 +1052,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val = sp->ival;
val = (val+offset)>>downshift;
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 255);
}
@ -1075,7 +1075,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val += (1<<(KDU_FIX_POINT-8))>>1;
val >>= (KDU_FIX_POINT-8);
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 255);
}
@ -1094,7 +1094,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val = (val+offset)>>downshift;
val <<= upshift;
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 256 - (1<<upshift));
}
@ -1116,7 +1116,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val = sp->ival;
val = (val+offset)>>downshift;
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 255);
}
@ -1132,7 +1132,7 @@ all necessary level shifting, type conversion, rounding and truncation. */
val = sp->ival;
val <<= upshift;
val += 128;
if (val & ((-1)<<8))
if (val & ((0xffffffffU)<<8))
{
val = (val < 0 ? 0 : 256 - (1<<upshift));
}

View File

@ -36,7 +36,8 @@
static std::map<std::string, U32> DefaultPoolSizes =
boost::assign::map_list_of
(std::string("Upload"), 1)
(std::string("AIS"), 25);
(std::string("AIS"), 1);
// *TODO: Rider for the moment keep AIS calls serialized otherwise the COF will tend to get out of sync.
#define DEFAULT_POOL_SIZE 5

View File

@ -14490,7 +14490,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>25</integer>
<integer>1</integer>
</map>
<key>PoolSizeUpload</key>
<map>

View File

@ -65,7 +65,12 @@
#pragma warning (disable:4702)
#endif
#if 1
namespace
{
const S32 BAKE_RETRY_MAX_COUNT = 5;
const F32 BAKE_RETRY_TIMEOUT = 2.0F;
}
// *TODO$: LLInventoryCallback should be deprecated to conform to the new boost::bind/coroutine model.
// temp code in transition
void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
@ -73,8 +78,6 @@ void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
if (cb.notNull())
cb->fire(id);
}
#endif
std::string self_av_string()
{
@ -3354,12 +3357,36 @@ LLSD LLAppearanceMgr::dumpCOF() const
void LLAppearanceMgr::requestServerAppearanceUpdate()
{
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
if (!mOutstandingAppearanceBakeRequest)
{
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
mRerequestAppearanceBake = false;
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
#else
LLCoros::instance().launch("serverAppearanceUpdateCoro",
boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
#endif
}
else
{
mRerequestAppearanceBake = true;
}
}
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
#else
void LLAppearanceMgr::serverAppearanceUpdateCoro()
#endif
{
#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
#endif
mRerequestAppearanceBake = false;
if (!gAgent.getRegion())
{
LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL;
@ -3386,57 +3413,57 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
return;
}
#if 0
static int reqcount = 0;
int r_count = ++reqcount;
LL_WARNS("Avatar") << "START: Server Bake request #" << r_count << "!" << LL_ENDL;
#endif
// If we have already received an update for this or higher cof version,
// put a warning in the log but request anyway.
S32 cofVersion = getCOFVersion();
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
" (Last Received:" << lastRcv << ")" <<
" (Last Requested:" << lastReq << ")" << LL_ENDL;
if ((cofVersion != LLViewerInventoryCategory::VERSION_UNKNOWN))
{
if (cofVersion < lastRcv)
{
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
<< " but requesting for " << cofVersion << LL_ENDL;
}
if (lastReq > cofVersion)
{
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
<< " but requesting for " << cofVersion << LL_ENDL;
}
}
// Actually send the request.
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
// LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter(
// "UpdateAvatarAppearance", gAgent.getAgentPolicy()));
llcoro::suspend();
S32 retryCount(0);
bool bRetry;
do
{
BoolSetter outstanding(mOutstandingAppearanceBakeRequest);
// If we have already received an update for this or higher cof version,
// put a warning in the log and cancel the request.
S32 cofVersion = getCOFVersion();
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
" (Last Received:" << lastRcv << ")" <<
" (Last Requested:" << lastReq << ")" << LL_ENDL;
if (cofVersion == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
LL_WARNS("AVatar") << "COF version is unknown... not requesting until COF version is known." << LL_ENDL;
return;
}
else
{
if (cofVersion < lastRcv)
{
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
<< " but requesting for " << cofVersion << LL_ENDL;
return;
}
if (lastReq > cofVersion)
{
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
<< " but requesting for " << cofVersion << LL_ENDL;
return;
}
}
// Actually send the request.
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
bRetry = false;
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest());
S32 reqCofVersion = getCOFVersion(); // Treat COF version (gets set by AISAPI as authoritative,
// not what the bake request tells us to use).
if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
{
reqCofVersion += 999;
cofVersion += 999;
LL_WARNS("Avatar") << "Forcing version failure on COF Baking" << LL_ENDL;
}
LL_INFOS() << "Requesting bake for COF version " << reqCofVersion << LL_ENDL;
LL_INFOS() << "Requesting bake for COF version " << cofVersion << LL_ENDL;
LLSD postData;
if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate"))
@ -3445,10 +3472,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
else
{
postData["cof_version"] = reqCofVersion;
postData["cof_version"] = cofVersion;
}
gAgentAvatarp->mLastUpdateRequestCOFVersion = reqCofVersion;
gAgentAvatarp->mLastUpdateRequestCOFVersion = cofVersion;
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
@ -3466,14 +3493,30 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
// on multiple machines.
if (result.has("expected"))
{
S32 expectedCofVersion = result["expected"].asInteger();
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
bRetry = true;
// Wait for a 1/2 second before trying again. Just to keep from asking too quickly.
llcoro::suspendUntilTimeout(0.5);
if (++retryCount > BAKE_RETRY_MAX_COUNT)
{
LL_WARNS("Avatar") << "Bake retry count exceeded!" << LL_ENDL;
break;
}
F32 timeout = pow(BAKE_RETRY_TIMEOUT, static_cast<float>(retryCount)) - 1.0;
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
bRetry = true;
continue;
}
else
{
LL_WARNS("Avatar") << "No retry attempted." << LL_ENDL;
break;
}
}
LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL;
@ -3484,10 +3527,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
} while (bRetry);
#if 0
LL_WARNS("Avatar") << "END: Server Bake request #" << r_count << "!" << LL_ENDL;
#endif
if (mRerequestAppearanceBake)
{ // A bake request came in while this one was still outstanding.
// Requeue ourself for a later request.
requestServerAppearanceUpdate();
}
}
/*static*/
@ -3855,7 +3899,9 @@ LLAppearanceMgr::LLAppearanceMgr():
mOutfitLocked(false),
mInFlightCounter(0),
mInFlightTimer(),
mIsInUpdateAppearanceFromCOF(false)
mIsInUpdateAppearanceFromCOF(false),
mOutstandingAppearanceBakeRequest(false),
mRerequestAppearanceBake(false)
{
LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
// unlock outfit on save operation completed

View File

@ -228,7 +228,12 @@ public:
private:
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
#else
void serverAppearanceUpdateCoro();
#endif
static void debugAppearanceUpdateCOF(const LLSD& content);
std::string mAppearanceServiceURL;
@ -255,6 +260,8 @@ private:
bool mAttachmentInvLinkEnabled;
bool mOutfitIsDirty;
bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls.
bool mOutstandingAppearanceBakeRequest; // A bake request is outstanding. Do not overlap.
bool mRerequestAppearanceBake;
/**
* Lock for blocking operations on outfit until server reply or timeout exceed

View File

@ -1312,6 +1312,13 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
if (parseRawCookie(sOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
media_instance->getMediaPlugin())
{
// MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
// url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
// For now, we use the URL for the OpenID POST request since it will have the same authority
// as the domain field.
// (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
url = std::string(sOpenIDURL.mURI) + "://" + std::string(sOpenIDURL.mAuthority);
media_instance->getMediaPlugin()->setCookie(url, cookie_name, cookie_value, cookie_host, cookie_path, httponly, secure);
}
}