pull back 3.4.1-beta6 fixes
commit
1709952adb
12
.hgtags
12
.hgtags
|
|
@ -69,6 +69,7 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
|||
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
|
||||
461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
|
|
@ -318,5 +319,14 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
|
|||
97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
|
||||
5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
|
||||
b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
|
||||
45028c687415ae2d6ca0c13fefca62cba60e013f DRTVWR-179
|
||||
b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
|
||||
2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
|
||||
0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
|
||||
e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
|
||||
f00068a66a2e2f72acbe3f690b98b323e740b289 DRTVWR-222
|
||||
305950187c628a5d6743ee9ea711cc5b9177a18e 3.4.1-beta4
|
||||
dd23d4da3bcb2ffda58569e759feb7c119982973 DRTVWR-224
|
||||
0bd3744ff060452aa13ff4992eafb381df7b1012 3.4.1-beta5
|
||||
29075f8c1abed53dcf195a59f61744e27a91108f DRTVWR-226
|
||||
fba99f381b8d4ad1b7b42fa4993b29998d95be18 DRTVWR-179
|
||||
49ed253c80bed7410e238eeab35a9f14cb034364 3.4.1-beta6
|
||||
|
|
|
|||
|
|
@ -1770,9 +1770,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>dde928cb24d22a267004a8c17669ba65</string>
|
||||
<string>8aedfdcf670348c18a9991ae1b384a61</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
|
|
@ -1782,9 +1782,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8308f7bd68bb7083655753b7abe7225f</string>
|
||||
<string>f62841804acb91e1309603a84f3f0ce8</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
|
|||
|
|
@ -289,6 +289,7 @@ void LLApp::setupErrorHandling()
|
|||
// occasionally checks to see if the app is in an error state, and sees if it needs to be run.
|
||||
|
||||
#if LL_WINDOWS
|
||||
#if LL_SEND_CRASH_REPORTS
|
||||
// This sets a callback to handle w32 signals to the console window.
|
||||
// The viewer shouldn't be affected, sicne its a windowed app.
|
||||
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE);
|
||||
|
|
@ -300,7 +301,7 @@ void LLApp::setupErrorHandling()
|
|||
mExceptionHandler = new google_breakpad::ExceptionHandler(
|
||||
L"C:\\Temp\\", 0, windows_post_minidump_callback, 0, google_breakpad::ExceptionHandler::HANDLER_ALL);
|
||||
}
|
||||
|
||||
#endif
|
||||
#else
|
||||
//
|
||||
// Start up signal handling.
|
||||
|
|
|
|||
|
|
@ -27,6 +27,13 @@
|
|||
#define LLMEMORY_H
|
||||
|
||||
#include "llmemtype.h"
|
||||
|
||||
#if LL_WINDOWS && LL_DEBUG
|
||||
#define LL_CHECK_MEMORY llassert(_CrtCheckMemory());
|
||||
#else
|
||||
#define LL_CHECK_MEMORY
|
||||
#endif
|
||||
|
||||
inline void* ll_aligned_malloc( size_t size, int align )
|
||||
{
|
||||
void* mem = malloc( size + (align - 1) + sizeof(void*) );
|
||||
|
|
@ -90,7 +97,7 @@ inline void* ll_aligned_realloc_16(void* ptr, size_t size, size_t old_size) // r
|
|||
#else // USE_TCMALLOC
|
||||
// ll_aligned_foo_16 are not needed with tcmalloc
|
||||
#define ll_aligned_malloc_16 malloc
|
||||
#define ll_aligned_realloc_16 realloc
|
||||
#define ll_aligned_realloc_16(a,b,c) realloc(a,b)
|
||||
#define ll_aligned_free_16 free
|
||||
#endif // USE_TCMALLOC
|
||||
|
||||
|
|
|
|||
|
|
@ -134,8 +134,8 @@ S32 LLQueuedThread::updateQueue(F32 max_time_ms)
|
|||
pending = getPending();
|
||||
if(pending > 0)
|
||||
{
|
||||
unpause();
|
||||
}
|
||||
unpause();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
|
|||
apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
|
||||
}
|
||||
mRunCondition = new LLCondition(mAPRPoolp);
|
||||
|
||||
mDataLock = new LLMutex(mAPRPoolp);
|
||||
mLocalAPRFilePoolp = NULL ;
|
||||
}
|
||||
|
||||
|
|
@ -173,7 +173,10 @@ void LLThread::shutdown()
|
|||
}
|
||||
|
||||
delete mRunCondition;
|
||||
mRunCondition = 0;
|
||||
mRunCondition = NULL;
|
||||
|
||||
delete mDataLock;
|
||||
mDataLock = NULL;
|
||||
|
||||
if (mIsLocalPool && mAPRPoolp)
|
||||
{
|
||||
|
|
@ -242,28 +245,30 @@ bool LLThread::runCondition(void)
|
|||
// Stop thread execution if requested until unpaused.
|
||||
void LLThread::checkPause()
|
||||
{
|
||||
mRunCondition->lock();
|
||||
mDataLock->lock();
|
||||
|
||||
// This is in a while loop because the pthread API allows for spurious wakeups.
|
||||
while(shouldSleep())
|
||||
{
|
||||
mDataLock->unlock();
|
||||
mRunCondition->wait(); // unlocks mRunCondition
|
||||
mDataLock->lock();
|
||||
// mRunCondition is locked when the thread wakes up
|
||||
}
|
||||
|
||||
mRunCondition->unlock();
|
||||
mDataLock->unlock();
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
||||
void LLThread::setQuitting()
|
||||
{
|
||||
mRunCondition->lock();
|
||||
mDataLock->lock();
|
||||
if (mStatus == RUNNING)
|
||||
{
|
||||
mStatus = QUITTING;
|
||||
}
|
||||
mRunCondition->unlock();
|
||||
mDataLock->unlock();
|
||||
wake();
|
||||
}
|
||||
|
||||
|
|
@ -285,12 +290,12 @@ void LLThread::yield()
|
|||
|
||||
void LLThread::wake()
|
||||
{
|
||||
mRunCondition->lock();
|
||||
mDataLock->lock();
|
||||
if(!shouldSleep())
|
||||
{
|
||||
mRunCondition->signal();
|
||||
}
|
||||
mRunCondition->unlock();
|
||||
mDataLock->unlock();
|
||||
}
|
||||
|
||||
void LLThread::wakeLocked()
|
||||
|
|
@ -481,6 +486,19 @@ LLThreadSafeRefCount::LLThreadSafeRefCount() :
|
|||
{
|
||||
}
|
||||
|
||||
LLThreadSafeRefCount::LLThreadSafeRefCount(const LLThreadSafeRefCount& src)
|
||||
{
|
||||
if (sMutex)
|
||||
{
|
||||
sMutex->lock();
|
||||
}
|
||||
mRef = 0;
|
||||
if (sMutex)
|
||||
{
|
||||
sMutex->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
LLThreadSafeRefCount::~LLThreadSafeRefCount()
|
||||
{
|
||||
if (mRef != 0)
|
||||
|
|
@ -489,6 +507,7 @@ LLThreadSafeRefCount::~LLThreadSafeRefCount()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//============================================================================
|
||||
|
||||
LLResponder::~LLResponder()
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ private:
|
|||
protected:
|
||||
std::string mName;
|
||||
LLCondition* mRunCondition;
|
||||
LLMutex* mDataLock;
|
||||
|
||||
apr_thread_t *mAPRThreadp;
|
||||
apr_pool_t *mAPRPoolp;
|
||||
|
|
@ -122,15 +123,15 @@ protected:
|
|||
inline void unlockData();
|
||||
|
||||
// This is the predicate that decides whether the thread should sleep.
|
||||
// It should only be called with mRunCondition locked, since the virtual runCondition() function may need to access
|
||||
// It should only be called with mDataLock locked, since the virtual runCondition() function may need to access
|
||||
// data structures that are thread-unsafe.
|
||||
bool shouldSleep(void) { return (mStatus == RUNNING) && (isPaused() || (!runCondition())); }
|
||||
|
||||
// To avoid spurious signals (and the associated context switches) when the condition may or may not have changed, you can do the following:
|
||||
// mRunCondition->lock();
|
||||
// mDataLock->lock();
|
||||
// if(!shouldSleep())
|
||||
// mRunCondition->signal();
|
||||
// mRunCondition->unlock();
|
||||
// mDataLock->unlock();
|
||||
};
|
||||
|
||||
//============================================================================
|
||||
|
|
@ -205,12 +206,12 @@ private:
|
|||
|
||||
void LLThread::lockData()
|
||||
{
|
||||
mRunCondition->lock();
|
||||
mDataLock->lock();
|
||||
}
|
||||
|
||||
void LLThread::unlockData()
|
||||
{
|
||||
mRunCondition->unlock();
|
||||
mDataLock->unlock();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -227,15 +228,27 @@ public:
|
|||
private:
|
||||
static LLMutex* sMutex;
|
||||
|
||||
private:
|
||||
LLThreadSafeRefCount(const LLThreadSafeRefCount&); // not implemented
|
||||
LLThreadSafeRefCount&operator=(const LLThreadSafeRefCount&); // not implemented
|
||||
|
||||
protected:
|
||||
virtual ~LLThreadSafeRefCount(); // use unref()
|
||||
|
||||
public:
|
||||
LLThreadSafeRefCount();
|
||||
LLThreadSafeRefCount(const LLThreadSafeRefCount&);
|
||||
LLThreadSafeRefCount& operator=(const LLThreadSafeRefCount& ref)
|
||||
{
|
||||
if (sMutex)
|
||||
{
|
||||
sMutex->lock();
|
||||
}
|
||||
mRef = 0;
|
||||
if (sMutex)
|
||||
{
|
||||
sMutex->unlock();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ref()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -133,12 +133,12 @@ std::string LLCurl::getVersionString()
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
LLCurl::Responder::Responder()
|
||||
: mReferenceCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLCurl::Responder::~Responder()
|
||||
{
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
@ -202,23 +202,6 @@ void LLCurl::Responder::completedHeader(U32 status, const std::string& reason, c
|
|||
|
||||
}
|
||||
|
||||
namespace boost
|
||||
{
|
||||
void intrusive_ptr_add_ref(LLCurl::Responder* p)
|
||||
{
|
||||
++p->mReferenceCount;
|
||||
}
|
||||
|
||||
void intrusive_ptr_release(LLCurl::Responder* p)
|
||||
{
|
||||
if (p && 0 == --p->mReferenceCount)
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::set<CURL*> LLCurl::Easy::sFreeHandles;
|
||||
|
|
@ -267,15 +250,18 @@ void LLCurl::Easy::releaseEasyHandle(CURL* handle)
|
|||
LLMutexLock lock(sHandleMutexp) ;
|
||||
if (sActiveHandles.find(handle) != sActiveHandles.end())
|
||||
{
|
||||
LL_CHECK_MEMORY
|
||||
sActiveHandles.erase(handle);
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
if(sFreeHandles.size() < MAX_NUM_FREE_HANDLES)
|
||||
{
|
||||
sFreeHandles.insert(handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
sFreeHandles.insert(handle);
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
else
|
||||
{
|
||||
LLCurl::deleteEasyHandle(handle) ;
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -318,13 +304,15 @@ LLCurl::Easy::~Easy()
|
|||
releaseEasyHandle(mCurlEasyHandle);
|
||||
--gCurlEasyCount;
|
||||
curl_slist_free_all(mHeaders);
|
||||
LL_CHECK_MEMORY
|
||||
for_each(mStrings.begin(), mStrings.end(), DeletePointerArray());
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
if (mResponder && LLCurl::sNotQuitting) //aborted
|
||||
{
|
||||
std::string reason("Request timeout, aborted.") ;
|
||||
mResponder->completedRaw(408, //HTTP_REQUEST_TIME_OUT, timeout, abort
|
||||
reason, mChannels, mOutput);
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
mResponder = NULL;
|
||||
}
|
||||
|
|
@ -599,35 +587,50 @@ void LLCurl::Multi::cleanup(bool deleted)
|
|||
llassert_always(deleted || !mValid) ;
|
||||
|
||||
LLMutexLock lock(mDeletionMutexp);
|
||||
|
||||
|
||||
|
||||
// Clean up active
|
||||
for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
|
||||
iter != mEasyActiveList.end(); ++iter)
|
||||
{
|
||||
Easy* easy = *iter;
|
||||
LL_CHECK_MEMORY
|
||||
check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
if(deleted)
|
||||
{
|
||||
easy->mResponder = NULL ; //avoid triggering mResponder.
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
delete easy;
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
mEasyActiveList.clear();
|
||||
mEasyActiveMap.clear();
|
||||
|
||||
// Clean up freed
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
// Clean up freed
|
||||
for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());
|
||||
mEasyFreeList.clear();
|
||||
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));
|
||||
mCurlMultiHandle = NULL ;
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
delete mMutexp ;
|
||||
mMutexp = NULL ;
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
delete mEasyMutexp ;
|
||||
mEasyMutexp = NULL ;
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
mQueued = 0 ;
|
||||
mState = STATE_COMPLETED;
|
||||
|
||||
|
|
@ -1104,6 +1107,7 @@ bool LLCurlRequest::getByteRange(const std::string& url,
|
|||
S32 offset, S32 length,
|
||||
LLCurl::ResponderPtr responder)
|
||||
{
|
||||
llassert(LLCurl::sNotQuitting);
|
||||
LLCurl::Easy* easy = allocEasy();
|
||||
if (!easy)
|
||||
{
|
||||
|
|
@ -1131,6 +1135,7 @@ bool LLCurlRequest::post(const std::string& url,
|
|||
const LLSD& data,
|
||||
LLCurl::ResponderPtr responder, S32 time_out)
|
||||
{
|
||||
llassert(LLCurl::sNotQuitting);
|
||||
LLCurl::Easy* easy = allocEasy();
|
||||
if (!easy)
|
||||
{
|
||||
|
|
@ -1158,6 +1163,7 @@ bool LLCurlRequest::post(const std::string& url,
|
|||
const std::string& data,
|
||||
LLCurl::ResponderPtr responder, S32 time_out)
|
||||
{
|
||||
llassert(LLCurl::sNotQuitting);
|
||||
LLCurl::Easy* easy = allocEasy();
|
||||
if (!easy)
|
||||
{
|
||||
|
|
@ -1714,29 +1720,42 @@ void LLCurl::cleanupClass()
|
|||
break ;
|
||||
}
|
||||
}
|
||||
LL_CHECK_MEMORY
|
||||
sCurlThread->shutdown() ;
|
||||
LL_CHECK_MEMORY
|
||||
delete sCurlThread ;
|
||||
sCurlThread = NULL ;
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
#if SAFE_SSL
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer());
|
||||
#endif
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)
|
||||
{
|
||||
CURL* curl = *iter;
|
||||
LLCurl::deleteEasyHandle(curl);
|
||||
}
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
Easy::sFreeHandles.clear();
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
delete Easy::sHandleMutexp ;
|
||||
Easy::sHandleMutexp = NULL ;
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
delete sHandleMutexp ;
|
||||
sHandleMutexp = NULL ;
|
||||
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
// removed as per https://jira.secondlife.com/browse/SH-3115
|
||||
//llassert(Easy::sActiveHandles.empty());
|
||||
}
|
||||
|
|
@ -1744,6 +1763,8 @@ void LLCurl::cleanupClass()
|
|||
//static
|
||||
CURLM* LLCurl::newMultiHandle()
|
||||
{
|
||||
llassert(sNotQuitting);
|
||||
|
||||
LLMutexLock lock(sHandleMutexp) ;
|
||||
|
||||
if(sTotalHandles + 1 > sMaxHandles)
|
||||
|
|
@ -1777,6 +1798,7 @@ CURLMcode LLCurl::deleteMultiHandle(CURLM* handle)
|
|||
//static
|
||||
CURL* LLCurl::newEasyHandle()
|
||||
{
|
||||
llassert(sNotQuitting);
|
||||
LLMutexLock lock(sHandleMutexp) ;
|
||||
|
||||
if(sTotalHandles + 1 > sMaxHandles)
|
||||
|
|
@ -1801,7 +1823,9 @@ void LLCurl::deleteEasyHandle(CURL* handle)
|
|||
if(handle)
|
||||
{
|
||||
LLMutexLock lock(sHandleMutexp) ;
|
||||
LL_CHECK_MEMORY
|
||||
curl_easy_cleanup(handle) ;
|
||||
LL_CHECK_MEMORY
|
||||
sTotalHandles-- ;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@
|
|||
#include "llthread.h"
|
||||
#include "llqueuedthread.h"
|
||||
#include "llframetimer.h"
|
||||
#include "llpointer.h"
|
||||
|
||||
|
||||
class LLMutex;
|
||||
class LLCurlThread;
|
||||
|
|
@ -67,7 +69,7 @@ public:
|
|||
F64 mSpeedDownload;
|
||||
};
|
||||
|
||||
class Responder
|
||||
class Responder : public LLThreadSafeRefCount
|
||||
{
|
||||
//LOG_CLASS(Responder);
|
||||
public:
|
||||
|
|
@ -126,13 +128,10 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
public: /* but not really -- don't touch this */
|
||||
U32 mReferenceCount;
|
||||
|
||||
private:
|
||||
std::string mURL;
|
||||
};
|
||||
typedef boost::intrusive_ptr<Responder> ResponderPtr;
|
||||
typedef LLPointer<Responder> ResponderPtr;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -378,12 +377,6 @@ private:
|
|||
void cleanupMulti(LLCurl::Multi* multi) ;
|
||||
} ;
|
||||
|
||||
namespace boost
|
||||
{
|
||||
void intrusive_ptr_add_ref(LLCurl::Responder* p);
|
||||
void intrusive_ptr_release(LLCurl::Responder* p);
|
||||
};
|
||||
|
||||
|
||||
class LLCurlRequest
|
||||
{
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
#include "llcurl.h"
|
||||
|
||||
LLCurl::Responder::Responder()
|
||||
: mReferenceCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -77,19 +76,3 @@ void LLCurl::Responder::result(LLSD const&)
|
|||
{
|
||||
}
|
||||
|
||||
namespace boost
|
||||
{
|
||||
void intrusive_ptr_add_ref(LLCurl::Responder* p)
|
||||
{
|
||||
++p->mReferenceCount;
|
||||
}
|
||||
|
||||
void intrusive_ptr_release(LLCurl::Responder* p)
|
||||
{
|
||||
if(p && 0 == --p->mReferenceCount)
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -189,9 +189,9 @@ namespace tut
|
|||
}
|
||||
|
||||
public:
|
||||
static boost::intrusive_ptr<Result> build(HTTPClientTestData& client)
|
||||
static Result* build(HTTPClientTestData& client)
|
||||
{
|
||||
return boost::intrusive_ptr<Result>(new Result(client));
|
||||
return new Result(client);
|
||||
}
|
||||
|
||||
~Result()
|
||||
|
|
|
|||
|
|
@ -1891,8 +1891,17 @@ bool LLAppViewer::cleanup()
|
|||
sTextureFetch->shutDownTextureCacheThread() ;
|
||||
sTextureFetch->shutDownImageDecodeThread() ;
|
||||
|
||||
llinfos << "Shutting down message system" << llendflush;
|
||||
end_messaging_system();
|
||||
|
||||
// *NOTE:Mani - The following call is not thread safe.
|
||||
LL_CHECK_MEMORY
|
||||
LLCurl::cleanupClass();
|
||||
LL_CHECK_MEMORY
|
||||
|
||||
LLFilePickerThread::cleanupClass();
|
||||
|
||||
//MUST happen AFTER LLCurl::cleanupClass
|
||||
delete sTextureCache;
|
||||
sTextureCache = NULL;
|
||||
delete sTextureFetch;
|
||||
|
|
@ -1961,12 +1970,6 @@ bool LLAppViewer::cleanup()
|
|||
|
||||
LLViewerAssetStatsFF::cleanup();
|
||||
|
||||
llinfos << "Shutting down message system" << llendflush;
|
||||
end_messaging_system();
|
||||
|
||||
// *NOTE:Mani - The following call is not thread safe.
|
||||
LLCurl::cleanupClass();
|
||||
|
||||
// If we're exiting to launch an URL, do that here so the screen
|
||||
// is at the right resolution before we launch IE.
|
||||
if (!gLaunchFileOnQuit.empty())
|
||||
|
|
|
|||
|
|
@ -131,7 +131,9 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
|
|||
// Note: This won't work when running from the debugger unless the _NO_DEBUG_HEAP environment variable is set to 1
|
||||
|
||||
// Enable to get mem debugging within visual studio.
|
||||
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
|
||||
#if LL_DEBUG
|
||||
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
|
||||
#else
|
||||
_CrtSetDbgFlag(0); // default, just making explicit
|
||||
|
||||
ULONG ulEnableLFH = 2;
|
||||
|
|
@ -145,6 +147,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
|
|||
else
|
||||
heap_enable_lfh_error[i] = GetLastError();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// *FIX: global
|
||||
|
|
|
|||
|
|
@ -919,7 +919,7 @@ public:
|
|||
bool uploadConfirmationCallback(
|
||||
const LLSD& notification,
|
||||
const LLSD& response,
|
||||
boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
|
||||
LLPointer<LLNewAgentInventoryVariablePriceResponder> responder)
|
||||
{
|
||||
S32 option;
|
||||
std::string confirmation_url;
|
||||
|
|
@ -949,7 +949,7 @@ public:
|
|||
|
||||
void confirmUpload(
|
||||
const std::string& confirmation_url,
|
||||
boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
|
||||
LLPointer<LLNewAgentInventoryVariablePriceResponder> responder)
|
||||
{
|
||||
if ( getFilename().empty() )
|
||||
{
|
||||
|
|
@ -1124,7 +1124,7 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
|
|||
// and cause sadness.
|
||||
mImpl->confirmUpload(
|
||||
confirmation_url,
|
||||
boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
|
||||
LLPointer<LLNewAgentInventoryVariablePriceResponder>(this));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1157,7 +1157,7 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
|
|||
mImpl,
|
||||
_1,
|
||||
_2,
|
||||
boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this)));
|
||||
LLPointer<LLNewAgentInventoryVariablePriceResponder>(this)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -951,6 +951,12 @@ LLSpatialGroup* LLDrawable::getSpatialGroup() const
|
|||
|
||||
void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
|
||||
{
|
||||
//precondition: mSpatialGroupp MUST be null or DEAD or mSpatialGroupp MUST NOT contain this
|
||||
llassert(!mSpatialGroupp || mSpatialGroupp->isDead() || !mSpatialGroupp->hasElement(this));
|
||||
|
||||
//precondition: groupp MUST be null or groupp MUST contain this
|
||||
llassert(!groupp || groupp->hasElement(this));
|
||||
|
||||
/*if (mSpatialGroupp && (groupp != mSpatialGroupp))
|
||||
{
|
||||
mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
|
||||
|
|
@ -970,9 +976,12 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
|
|||
}
|
||||
}
|
||||
|
||||
mSpatialGroupp = groupp;
|
||||
//postcondition: if next group is NULL, previous group must be dead OR NULL OR binIndex must be -1
|
||||
//postcondition: if next group is NOT NULL, binIndex must not be -1
|
||||
llassert(groupp == NULL ? (mSpatialGroupp == NULL || mSpatialGroupp->isDead()) || getBinIndex() == -1 :
|
||||
getBinIndex() != -1);
|
||||
|
||||
llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
|
||||
mSpatialGroupp = groupp;
|
||||
}
|
||||
|
||||
LLSpatialPartition* LLDrawable::getSpatialPartition()
|
||||
|
|
@ -1400,7 +1409,7 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
|
|||
markDead();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (gShiftFrame)
|
||||
{
|
||||
return;
|
||||
|
|
@ -1483,13 +1492,11 @@ void LLSpatialBridge::cleanupReferences()
|
|||
LLDrawable::cleanupReferences();
|
||||
if (mDrawable)
|
||||
{
|
||||
LLSpatialGroup* group = mDrawable->getSpatialGroup();
|
||||
if (group)
|
||||
{
|
||||
group->mOctreeNode->remove(mDrawable);
|
||||
mDrawable->setSpatialGroup(NULL);
|
||||
}
|
||||
/*
|
||||
|
||||
DON'T DO THIS -- this should happen through octree destruction
|
||||
|
||||
mDrawable->setSpatialGroup(NULL);
|
||||
if (mDrawable->getVObj())
|
||||
{
|
||||
LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
|
||||
|
|
@ -1500,15 +1507,10 @@ void LLSpatialBridge::cleanupReferences()
|
|||
LLDrawable* drawable = child->mDrawable;
|
||||
if (drawable)
|
||||
{
|
||||
LLSpatialGroup* group = drawable->getSpatialGroup();
|
||||
if (group)
|
||||
{
|
||||
group->mOctreeNode->remove(drawable);
|
||||
drawable->setSpatialGroup(NULL);
|
||||
}
|
||||
drawable->setSpatialGroup(NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
LLDrawable* drawablep = mDrawable;
|
||||
mDrawable = NULL;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ namespace
|
|||
|
||||
class LLEventPollEventTimer : public LLEventTimer
|
||||
{
|
||||
typedef boost::intrusive_ptr<LLEventPollResponder> EventPollResponderPtr;
|
||||
typedef LLPointer<LLEventPollResponder> EventPollResponderPtr;
|
||||
|
||||
public:
|
||||
LLEventPollEventTimer(F32 period, EventPollResponderPtr responder)
|
||||
|
|
|
|||
|
|
@ -71,9 +71,9 @@ class LLIamHere : public LLHTTPClient::Responder
|
|||
|
||||
public:
|
||||
|
||||
static boost::intrusive_ptr< LLIamHere > build( LLFloaterTOS* parent )
|
||||
static LLIamHere* build( LLFloaterTOS* parent )
|
||||
{
|
||||
return boost::intrusive_ptr< LLIamHere >( new LLIamHere( parent ) );
|
||||
return new LLIamHere( parent );
|
||||
};
|
||||
|
||||
virtual void setParent( LLFloaterTOS* parentIn )
|
||||
|
|
@ -102,7 +102,7 @@ class LLIamHere : public LLHTTPClient::Responder
|
|||
|
||||
// this is global and not a class member to keep crud out of the header file
|
||||
namespace {
|
||||
boost::intrusive_ptr< LLIamHere > gResponsePtr = 0;
|
||||
LLPointer< LLIamHere > gResponsePtr = 0;
|
||||
};
|
||||
|
||||
BOOL LLFloaterTOS::postBuild()
|
||||
|
|
|
|||
|
|
@ -1859,6 +1859,8 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
|
|||
drawablep->setSpatialGroup(NULL);
|
||||
}
|
||||
|
||||
drawablep->setSpatialGroup(NULL);
|
||||
|
||||
assert_octree_valid(mOctree);
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -4194,7 +4196,7 @@ public:
|
|||
{
|
||||
if (index < 255)
|
||||
{
|
||||
if (facep->mDrawInfo->mTextureList.size()<= index)
|
||||
if (facep->mDrawInfo->mTextureList.size() <= index)
|
||||
{
|
||||
llerrs << "Face texture index out of bounds." << llendl;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -350,6 +350,8 @@ public:
|
|||
element_list& getData() { return mOctreeNode->getData(); }
|
||||
element_iter getDataBegin() { return mOctreeNode->getDataBegin(); }
|
||||
element_iter getDataEnd() { return mOctreeNode->getDataEnd(); }
|
||||
bool hasElement(LLDrawable* drawablep) { return std::find(mOctreeNode->getDataBegin(), mOctreeNode->getDataEnd(), drawablep) != mOctreeNode->getDataEnd(); }
|
||||
|
||||
U32 getElementCount() const { return mOctreeNode->getElementCount(); }
|
||||
bool isEmpty() const { return mOctreeNode->isEmpty(); }
|
||||
|
||||
|
|
|
|||
|
|
@ -2977,7 +2977,9 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
|
|||
|
||||
~lcl_responder()
|
||||
{
|
||||
LL_CHECK_MEMORY
|
||||
mFetcher->decrCurlPOSTCount();
|
||||
LL_CHECK_MEMORY
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
|
|||
|
|
@ -263,8 +263,8 @@ public :
|
|||
EService mService;
|
||||
};
|
||||
|
||||
typedef boost::intrusive_ptr<TranslationReceiver> TranslationReceiverPtr;
|
||||
typedef boost::intrusive_ptr<KeyVerificationReceiver> KeyVerificationReceiverPtr;
|
||||
typedef LLPointer<TranslationReceiver> TranslationReceiverPtr;
|
||||
typedef LLPointer<KeyVerificationReceiver> KeyVerificationReceiverPtr;
|
||||
|
||||
/**
|
||||
* Translate given text.
|
||||
|
|
|
|||
|
|
@ -3340,9 +3340,9 @@ public :
|
|||
{
|
||||
}
|
||||
|
||||
static boost::intrusive_ptr<ChatTranslationReceiver> build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args)
|
||||
static ChatTranslationReceiver* build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args)
|
||||
{
|
||||
return boost::intrusive_ptr<ChatTranslationReceiver>(new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args));
|
||||
return new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -255,10 +255,9 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static boost::intrusive_ptr<BaseCapabilitiesComplete> build( U64 region_handle, S32 id )
|
||||
static BaseCapabilitiesComplete* build( U64 region_handle, S32 id )
|
||||
{
|
||||
return boost::intrusive_ptr<BaseCapabilitiesComplete>(
|
||||
new BaseCapabilitiesComplete(region_handle, id) );
|
||||
return new BaseCapabilitiesComplete(region_handle, id);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -299,11 +299,6 @@ LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLCo
|
|||
std::string LLControlGroup::getString(const std::string& name) { return "dummy"; }
|
||||
LLControlGroup::~LLControlGroup() {}
|
||||
|
||||
namespace boost {
|
||||
void intrusive_ptr_add_ref(LLCurl::Responder*) {}
|
||||
void intrusive_ptr_release(LLCurl::Responder*) {}
|
||||
}
|
||||
|
||||
LLCurl::Responder::Responder() {}
|
||||
void LLCurl::Responder::completedHeader(U32, std::string const&, LLSD const&) {}
|
||||
void LLCurl::Responder::completedRaw(U32, const std::string&, const LLChannelDescriptors&, const LLIOPipe::buffer_ptr_t& buffer) {}
|
||||
|
|
@ -314,7 +309,7 @@ void LLCurl::Responder::result(LLSD const&) {}
|
|||
LLCurl::Responder::~Responder() {}
|
||||
|
||||
void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {}
|
||||
void LLHTTPClient::get(const std::string&, boost::intrusive_ptr<LLCurl::Responder>, const LLSD&, const F32) {}
|
||||
void LLHTTPClient::get(const std::string&, LLPointer<LLCurl::Responder>, const LLSD&, const F32) {}
|
||||
|
||||
LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer)
|
||||
: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {}
|
||||
|
|
|
|||
|
|
@ -537,6 +537,7 @@ class WindowsManifest(ViewerManifest):
|
|||
result += 'File ' + pkg_file + '\n'
|
||||
else:
|
||||
result += 'Delete ' + wpath(os.path.join('$INSTDIR', rel_file)) + '\n'
|
||||
|
||||
# at the end of a delete, just rmdir all the directories
|
||||
if not install:
|
||||
deleted_file_dirs = [os.path.dirname(pair[1].replace(self.get_dst_prefix()+os.path.sep,'')) for pair in self.file_list]
|
||||
|
|
@ -1105,9 +1106,7 @@ class Linux_i686Manifest(LinuxManifest):
|
|||
# version number.
|
||||
self.path("libfontconfig.so.*.*")
|
||||
try:
|
||||
self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools
|
||||
self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools
|
||||
self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools
|
||||
self.path("libtcmalloc.so*") #formerly called google perf tools
|
||||
pass
|
||||
except:
|
||||
print "tcmalloc files not found, skipping"
|
||||
|
|
|
|||
|
|
@ -51,37 +51,6 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class LLUpdateChecker::Implementation:
|
||||
public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
Implementation(Client & client);
|
||||
~Implementation();
|
||||
void checkVersion(std::string const & protocolVersion, std::string const & hostUrl,
|
||||
std::string const & servicePath, std::string channel, std::string version);
|
||||
|
||||
// Responder:
|
||||
virtual void completed(U32 status,
|
||||
const std::string & reason,
|
||||
const LLSD& content);
|
||||
virtual void error(U32 status, const std::string & reason);
|
||||
|
||||
private:
|
||||
static const char * sProtocolVersion;
|
||||
|
||||
Client & mClient;
|
||||
LLHTTPClient mHttpClient;
|
||||
bool mInProgress;
|
||||
std::string mVersion;
|
||||
|
||||
std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl,
|
||||
std::string const & servicePath, std::string channel, std::string version);
|
||||
|
||||
LOG_CLASS(LLUpdateChecker::Implementation);
|
||||
};
|
||||
|
||||
|
||||
|
||||
// LLUpdateChecker
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
|
@ -134,13 +103,7 @@ void LLUpdateChecker::Implementation::checkVersion(std::string const & protocolV
|
|||
std::string checkUrl = buildUrl(protocolVersion, hostUrl, servicePath, channel, version);
|
||||
LL_INFOS("UpdateCheck") << "checking for updates at " << checkUrl << llendl;
|
||||
|
||||
// The HTTP client will wrap a raw pointer in a boost::intrusive_ptr causing the
|
||||
// passed object to be silently and automatically deleted. We pass a self-
|
||||
// referential intrusive pointer to which we add a reference to keep the
|
||||
// client from deleting the update checker implementation instance.
|
||||
LLHTTPClient::ResponderPtr temporaryPtr(this);
|
||||
boost::intrusive_ptr_add_ref(temporaryPtr.get());
|
||||
mHttpClient.get(checkUrl, temporaryPtr);
|
||||
mHttpClient.get(checkUrl, this);
|
||||
}
|
||||
|
||||
void LLUpdateChecker::Implementation::completed(U32 status,
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include "llhttpclient.h"
|
||||
|
||||
//
|
||||
// Implements asynchronous checking for updates.
|
||||
|
|
@ -36,7 +37,36 @@
|
|||
class LLUpdateChecker {
|
||||
public:
|
||||
class Client;
|
||||
class Implementation;
|
||||
class Implementation:
|
||||
|
||||
public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
Implementation(Client & client);
|
||||
~Implementation();
|
||||
void checkVersion(std::string const & protocolVersion, std::string const & hostUrl,
|
||||
std::string const & servicePath, std::string channel, std::string version);
|
||||
|
||||
// Responder:
|
||||
virtual void completed(U32 status,
|
||||
const std::string & reason,
|
||||
const LLSD& content);
|
||||
virtual void error(U32 status, const std::string & reason);
|
||||
|
||||
private:
|
||||
static const char * sProtocolVersion;
|
||||
|
||||
Client & mClient;
|
||||
LLHTTPClient mHttpClient;
|
||||
bool mInProgress;
|
||||
std::string mVersion;
|
||||
|
||||
std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl,
|
||||
std::string const & servicePath, std::string channel, std::string version);
|
||||
|
||||
LOG_CLASS(LLUpdateChecker::Implementation);
|
||||
};
|
||||
|
||||
|
||||
// An exception that may be raised on check errors.
|
||||
class CheckError;
|
||||
|
|
@ -48,7 +78,7 @@ public:
|
|||
std::string const & servicePath, std::string channel, std::string version);
|
||||
|
||||
private:
|
||||
boost::shared_ptr<Implementation> mImplementation;
|
||||
LLPointer<Implementation> mImplementation;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue