William Todd Stinson 2012-10-16 15:19:31 -07:00
commit 8f9da8b37d
61 changed files with 1079 additions and 899 deletions

25
.hgtags
View File

@ -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
@ -274,7 +275,6 @@ cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
4ad8a3afe40e0200309e3ada68932c4295ac2795 DRTVWR-179
4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
@ -311,3 +311,26 @@ de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
733ceac77583874f3626ef7a15c105b83ef0f5bb 3.4.0-beta7
97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
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
468ca3268229011a59df99229b24315844b33d34 DRTVWR-227
524da902713e8b60322640b9825101add4a7c497 3.4.1-beta7
173c2809f9873499c4b9d6bc044ec941c954d3fb DRTVWR-228
1dc94555582f52718834081e7659e973ae4521f7 3.4.1-beta8

View File

@ -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>

View File

@ -78,7 +78,7 @@ pre_build()
check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries
end_section "Pre$variant"
end_section "Pre$variant"
}
package_llphysicsextensions_tpv()

View File

@ -3,7 +3,7 @@ include(Prebuilt)
# If you want to enable or disable TCMALLOC in viewer builds, this is the place.
# set ON or OFF as desired.
set (USE_TCMALLOC ON)
set (USE_TCMALLOC OFF)
if (STANDALONE)
include(FindGooglePerfTools)

View File

@ -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.

View File

@ -252,21 +252,6 @@ U32 LLMemory::getAllocatedMemKB()
return sAllocatedMemInKB ;
}
void* ll_allocate (size_t size)
{
if (size == 0)
{
llwarns << "Null allocation" << llendl;
}
void *p = malloc(size);
if (p == NULL)
{
LLMemory::freeReserve();
llerrs << "Out of memory Error" << llendl;
}
return p;
}
//----------------------------------------------------------------------------
#if defined(LL_WINDOWS)
@ -1365,7 +1350,7 @@ char* LLPrivateMemoryPool::allocate(U32 size)
//if the asked size larger than MAX_BLOCK_SIZE, fetch from heap directly, the pool does not manage it
if(size >= CHUNK_SIZE)
{
return (char*)malloc(size) ;
return (char*)ll_aligned_malloc_16(size) ;
}
char* p = NULL ;
@ -1422,7 +1407,7 @@ char* LLPrivateMemoryPool::allocate(U32 size)
to_log = false ;
}
return (char*)malloc(size) ;
return (char*)ll_aligned_malloc_16(size) ;
}
return p ;
@ -1441,7 +1426,7 @@ void LLPrivateMemoryPool::freeMem(void* addr)
if(!chunk)
{
free(addr) ; //release from heap
ll_aligned_free_16(addr) ; //release from heap
}
else
{
@ -1565,7 +1550,7 @@ LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_inde
mReservedPoolSize += preferred_size + overhead ;
char* buffer = (char*)malloc(preferred_size + overhead) ;
char* buffer = (char*)ll_aligned_malloc_16(preferred_size + overhead) ;
if(!buffer)
{
return NULL ;
@ -1633,7 +1618,7 @@ void LLPrivateMemoryPool::removeChunk(LLMemoryChunk* chunk)
mReservedPoolSize -= chunk->getBufferSize() ;
//release memory
free(chunk->getBuffer()) ;
ll_aligned_free_16(chunk->getBuffer()) ;
}
U16 LLPrivateMemoryPool::findHashKey(const char* addr)
@ -1977,7 +1962,7 @@ char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size,
if(!poolp)
{
p = (char*)malloc(size) ;
p = (char*)ll_aligned_malloc_16(size) ;
}
else
{
@ -2006,7 +1991,7 @@ char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size)
}
else
{
return (char*)malloc(size) ;
return (char*)ll_aligned_malloc_16(size) ;
}
}
#endif
@ -2031,7 +2016,7 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr
{
if(!sPrivatePoolEnabled)
{
free(addr) ; //private pool is disabled.
ll_aligned_free_16(addr) ; //private pool is disabled.
}
else if(!sInstance) //the private memory manager is destroyed, try the dangling list
{

View File

@ -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*) );
@ -58,17 +65,6 @@ inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed wi
#endif
}
inline void* ll_aligned_realloc_16(void* ptr, size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
{
#if defined(LL_WINDOWS)
return _aligned_realloc(ptr, size, 16);
#elif defined(LL_DARWIN)
return realloc(ptr,size); // default osx malloc is 16 byte aligned.
#else
return realloc(ptr,size); // FIXME not guaranteed to be aligned.
#endif
}
inline void ll_aligned_free_16(void *p)
{
#if defined(LL_WINDOWS)
@ -79,10 +75,29 @@ inline void ll_aligned_free_16(void *p)
free(p); // posix_memalign() is compatible with heap deallocator
#endif
}
inline void* ll_aligned_realloc_16(void* ptr, size_t size, size_t old_size) // returned hunk MUST be freed with ll_aligned_free_16().
{
#if defined(LL_WINDOWS)
return _aligned_realloc(ptr, size, 16);
#elif defined(LL_DARWIN)
return realloc(ptr,size); // default osx malloc is 16 byte aligned.
#else
//FIXME: memcpy is SLOW
void* ret = ll_aligned_malloc_16(size);
if (ptr)
{
memcpy(ret, ptr, old_size);
ll_aligned_free_16(ptr);
}
return ret;
#endif
}
#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

View File

@ -134,8 +134,8 @@ S32 LLQueuedThread::updateQueue(F32 max_time_ms)
pending = getPending();
if(pending > 0)
{
unpause();
}
unpause();
}
}
else
{

View File

@ -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()

View File

@ -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()
{

View File

@ -29,7 +29,7 @@
const S32 LL_VERSION_MAJOR = 3;
const S32 LL_VERSION_MINOR = 4;
const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_PATCH = 2;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";

View File

@ -1665,6 +1665,12 @@ static void avg4_colors2(const U8* a, const U8* b, const U8* c, const U8* d, U8*
dst[1] = (U8)(((U32)(a[1]) + b[1] + c[1] + d[1])>>2);
}
void LLImageBase::setDataAndSize(U8 *data, S32 size)
{
ll_assert_aligned(data, 16);
mData = data; mDataSize = size;
}
//static
void LLImageBase::generateMip(const U8* indata, U8* mipdata, S32 width, S32 height, S32 nchannels)
{

View File

@ -148,7 +148,7 @@ public:
protected:
// special accessor to allow direct setting of mData and mDataSize by LLImageFormatted
void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }
void setDataAndSize(U8 *data, S32 size);
public:
static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);

View File

@ -6979,19 +6979,20 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
{
S32 new_verts = mNumVertices+1;
S32 new_size = new_verts*16;
// S32 old_size = mNumVertices*16;
S32 old_size = mNumVertices*16;
//positions
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_size);
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_size, old_size);
ll_assert_aligned(mPositions,16);
//normals
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_size);
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_size, old_size);
ll_assert_aligned(mNormals,16);
//tex coords
new_size = ((new_verts*8)+0xF) & ~0xF;
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, new_size);
old_size = ((mNumVertices*8)+0xF) & ~0xF;
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, new_size, old_size);
ll_assert_aligned(mTexCoords,16);
@ -7045,7 +7046,7 @@ void LLVolumeFace::pushIndex(const U16& idx)
S32 old_size = ((mNumIndices*2)+0xF) & ~0xF;
if (new_size != old_size)
{
mIndices = (U16*) ll_aligned_realloc_16(mIndices, new_size);
mIndices = (U16*) ll_aligned_realloc_16(mIndices, new_size, old_size);
ll_assert_aligned(mIndices,16);
}
@ -7087,11 +7088,11 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
}
//allocate new buffer space
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_count*sizeof(LLVector4a));
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_count*sizeof(LLVector4a), mNumVertices*sizeof(LLVector4a));
ll_assert_aligned(mPositions, 16);
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_count*sizeof(LLVector4a));
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_count*sizeof(LLVector4a), mNumVertices*sizeof(LLVector4a));
ll_assert_aligned(mNormals, 16);
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF, (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF);
ll_assert_aligned(mTexCoords, 16);
mNumVertices = new_count;
@ -7138,7 +7139,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
new_count = mNumIndices + face.mNumIndices;
//allocate new index buffer
mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF, (mNumIndices*sizeof(U16)+0xF) & ~0xF);
//get destination address into new index buffer
U16* dst_idx = mIndices+mNumIndices;

View File

@ -34,16 +34,6 @@
#include "../llsimdmath.h"
#include "../llvector4a.h"
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void *p)
{
ll_aligned_free_16(p);
}
namespace tut
{
@ -59,6 +49,27 @@ tut::alignment_test_t tut_alignment_test("LLAlignment");
LL_ALIGN_PREFIX(16)
class MyVector4a
{
public:
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void *p)
{
ll_aligned_free_16(p);
}
void* operator new[](size_t count)
{ // try to allocate count bytes for an array
return ll_aligned_malloc_16(count);
}
void operator delete[](void *p)
{
ll_aligned_free_16(p);
}
LLQuad mQ;
} LL_ALIGN_POSTFIX(16);
@ -78,7 +89,7 @@ void alignment_test_object_t::test<1>()
align_ptr = ll_aligned_malloc_16(sizeof(MyVector4a));
ensure("ll_aligned_malloc_16 failed", is_aligned(align_ptr,16));
align_ptr = ll_aligned_realloc_16(align_ptr,2*sizeof(MyVector4a));
align_ptr = ll_aligned_realloc_16(align_ptr,2*sizeof(MyVector4a), sizeof(MyVector4a));
ensure("ll_aligned_realloc_16 failed", is_aligned(align_ptr,16));
ll_aligned_free_16(align_ptr);

View File

@ -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-- ;
}
}

View File

@ -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
{

View File

@ -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;
}
}
};

View File

@ -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()
@ -258,7 +258,6 @@ namespace tut
void HTTPClientTestObject::test<1>()
{
LLHTTPClient::get(local_server, newResult());
runThePump();
ensureStatusOK();
ensure("result object wasn't destroyed", mResultDeleted);

View File

@ -1074,7 +1074,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
mAuthURL = message.getValue("url");
mAuthRealm = message.getValue("realm");
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_AUTH_REQUEST);
}
}
else if(message_name == "debug_message")
{
mDebugMessageText = message.getValue("message_text");

View File

@ -291,7 +291,6 @@ void LLVBOPool::seedPool()
void LLVBOPool::cleanup()
{
U32 size = LL_VBO_BLOCK_SIZE;

View File

@ -1564,6 +1564,7 @@ set(PACKAGE ON CACHE BOOL
if (WINDOWS)
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
# *TODO -reenable this once we get server usage sorted out
LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF"

View File

@ -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())

View File

@ -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

View File

@ -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)));
}
}

View File

@ -952,6 +952,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);
@ -971,9 +977,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()
@ -1401,7 +1410,7 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
markDead();
return;
}
if (gShiftFrame)
{
return;
@ -1484,13 +1493,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();
@ -1501,15 +1508,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;

View File

@ -411,12 +411,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
continue;
}
if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
{ //FIXME!
llwarns << "Missing required components, skipping render batch." << llendl;
continue;
}
LLRenderPass::applyModelMatrix(params);

View File

@ -83,6 +83,16 @@ public:
LLDriverParam(LLWearable *wearablep);
~LLDriverParam();
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
}
// Special: These functions are overridden by child classes
LLDriverParamInfo* getInfo() const { return (LLDriverParamInfo*)mInfo; }
// This sets mInfo and calls initialization functions

View File

@ -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)

3
indra/newview/llface.cpp Normal file → Executable file
View File

@ -166,7 +166,8 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
//special value to indicate uninitialized position
mIndicesIndex = 0xFFFFFFFF;
mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
mTextureIndex = 255;

View File

@ -211,8 +211,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
BOOL item_is_multi = FALSE;
if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
{
item_is_multi = TRUE;
}

View File

@ -98,7 +98,11 @@ LLFloaterPathfindingLinksets::LLFloaterPathfindingLinksets(const LLSD& pSeed)
mLabelSuggestedUseD(NULL),
mEditD(NULL),
mApplyEditsButton(NULL),
mBeaconColor()
mBeaconColor(),
mPreviousValueA(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
mPreviousValueB(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
mPreviousValueC(LLPathfindingLinkset::MAX_WALKABILITY_VALUE),
mPreviousValueD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE)
{
}
@ -168,7 +172,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditA = findChild<LLLineEditor>("edit_a_value");
llassert(mEditA != NULL);
mEditA->setPrevalidate(LLTextValidate::validateNonNegativeS32);
mEditA->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
mEditA->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueA));
mLabelEditB = findChild<LLTextBase>("edit_b_label");
llassert(mLabelEditB != NULL);
@ -179,7 +183,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditB = findChild<LLLineEditor>("edit_b_value");
llassert(mEditB != NULL);
mEditB->setPrevalidate(LLTextValidate::validateNonNegativeS32);
mEditB->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
mEditB->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueB));
mLabelEditC = findChild<LLTextBase>("edit_c_label");
llassert(mLabelEditC != NULL);
@ -190,7 +194,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditC = findChild<LLLineEditor>("edit_c_value");
llassert(mEditC != NULL);
mEditC->setPrevalidate(LLTextValidate::validateNonNegativeS32);
mEditC->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
mEditC->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueC));
mLabelEditD = findChild<LLTextBase>("edit_d_label");
llassert(mLabelEditD != NULL);
@ -201,7 +205,7 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
mEditD = findChild<LLLineEditor>("edit_d_value");
llassert(mEditD != NULL);
mEditD->setPrevalidate(LLTextValidate::validateNonNegativeS32);
mEditD->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
mEditD->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1, mPreviousValueD));
mApplyEditsButton = findChild<LLButton>("apply_edit_values");
llassert(mApplyEditsButton != NULL);
@ -323,26 +327,38 @@ void LLFloaterPathfindingLinksets::onClearFiltersClicked()
rebuildObjectsScrollList();
}
void LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl)
void LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl, LLSD &pPreviousValue)
{
LLLineEditor *pLineEditor = static_cast<LLLineEditor *>(pUICtrl);
llassert(pLineEditor != NULL);
const std::string &valueString = pLineEditor->getText();
S32 value;
if (LLStringUtil::convertToS32(valueString, value))
S32 intValue;
LLSD value;
bool doResetValue = false;
if (valueString.empty())
{
if ((value < LLPathfindingLinkset::MIN_WALKABILITY_VALUE) || (value > LLPathfindingLinkset::MAX_WALKABILITY_VALUE))
{
value = llclamp(value, LLPathfindingLinkset::MIN_WALKABILITY_VALUE, LLPathfindingLinkset::MAX_WALKABILITY_VALUE);
pLineEditor->setValue(LLSD(value));
}
value = pPreviousValue;
doResetValue = true;
}
else if (LLStringUtil::convertToS32(valueString, intValue))
{
doResetValue = ((intValue < LLPathfindingLinkset::MIN_WALKABILITY_VALUE) || (intValue > LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
value = LLSD(llclamp(intValue, LLPathfindingLinkset::MIN_WALKABILITY_VALUE, LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
}
else
{
pLineEditor->setValue(LLSD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
value = LLSD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE);
doResetValue = true;
}
if (doResetValue)
{
pLineEditor->setValue(value);
}
pPreviousValue = value;
}
void LLFloaterPathfindingLinksets::onApplyChangesClicked()
@ -376,10 +392,14 @@ void LLFloaterPathfindingLinksets::updateEditFieldValues()
const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(firstSelectedObjectPtr.get());
setEditLinksetUse(linkset->getLinksetUse());
mEditA->setValue(LLSD(linkset->getWalkabilityCoefficientA()));
mEditB->setValue(LLSD(linkset->getWalkabilityCoefficientB()));
mEditC->setValue(LLSD(linkset->getWalkabilityCoefficientC()));
mEditD->setValue(LLSD(linkset->getWalkabilityCoefficientD()));
mPreviousValueA = LLSD(linkset->getWalkabilityCoefficientA());
mPreviousValueB = LLSD(linkset->getWalkabilityCoefficientB());
mPreviousValueC = LLSD(linkset->getWalkabilityCoefficientC());
mPreviousValueD = LLSD(linkset->getWalkabilityCoefficientD());
mEditA->setValue(mPreviousValueA);
mEditB->setValue(mPreviousValueB);
mEditC->setValue(mPreviousValueC);
mEditD->setValue(mPreviousValueD);
}
}

View File

@ -74,7 +74,7 @@ private:
void onApplyAllFilters();
void onClearFiltersClicked();
void onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl);
void onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl, LLSD &pPreviousValue);
void onApplyChangesClicked();
void clearFilters();
@ -132,6 +132,11 @@ private:
LLButton *mApplyEditsButton;
LLColor4 mBeaconColor;
LLSD mPreviousValueA;
LLSD mPreviousValueB;
LLSD mPreviousValueC;
LLSD mPreviousValueD;
};
#endif // LL_LLFLOATERPATHFINDINGLINKSETS_H

View File

@ -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()

View File

@ -2234,12 +2234,11 @@ void LLFolderView::doIdle()
mDebugFilters = debug_filters;
arrangeAll();
}
BOOL filter_modified_and_active = mFilter->isModified() && mFilter->isNotDefault();
mNeedsAutoSelect = filter_modified_and_active &&
!(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
mFilter->clearModified();
// filter to determine visibility before arranging
filterFromRoot();

View File

@ -115,8 +115,8 @@ void LLPanelMarketplaceInbox::onFocusReceived()
if (sidepanel_inventory)
{
sidepanel_inventory->clearSelections(true, false);
}
}
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
@ -168,8 +168,8 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const
if (inbox_item_view && inbox_item_view->isFresh())
{
fresh_item_count++;
}
}
}
}
}
}

View File

@ -241,7 +241,7 @@ BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
mBaseNormals[i].clear();
mBaseBinormals[i].clear();
mTexCoords[i].clear();
mWeights[i] = 0.f;
mWeights[i] = 0.f;
}
mNumVertices = numVertices;
return TRUE;

View File

@ -406,6 +406,16 @@ public:
LLPolySkeletalDistortion(LLVOAvatar *avatarp);
~LLPolySkeletalDistortion();
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
}
// Special: These functions are overridden by child classes
LLPolySkeletalDistortionInfo* getInfo() const { return (LLPolySkeletalDistortionInfo*)mInfo; }
// This sets mInfo and calls initialization functions

View File

@ -73,9 +73,9 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
{
const S32 numVertices = mNumIndices;
mCoords = new LLVector4a[numVertices];
mNormals = new LLVector4a[numVertices];
mBinormals = new LLVector4a[numVertices];
mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mTexCoords = new LLVector2[numVertices];
mVertexIndices = new U32[numVertices];
@ -89,17 +89,12 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
}
}
//-----------------------------------------------------------------------------
// ~LLPolyMorphData()
//-----------------------------------------------------------------------------
LLPolyMorphData::~LLPolyMorphData()
{
delete [] mVertexIndices;
delete [] mCoords;
delete [] mNormals;
delete [] mBinormals;
delete [] mTexCoords;
freeData();
}
//-----------------------------------------------------------------------------
@ -118,12 +113,17 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
return FALSE;
}
//-------------------------------------------------------------------------
// free any existing data
//-------------------------------------------------------------------------
freeData();
//-------------------------------------------------------------------------
// allocate vertices
//-------------------------------------------------------------------------
mCoords = new LLVector4a[numVertices];
mNormals = new LLVector4a[numVertices];
mBinormals = new LLVector4a[numVertices];
mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(numVertices * sizeof(LLVector4a)));
mTexCoords = new LLVector2[numVertices];
// Actually, we are allocating more space than we need for the skiplist
mVertexIndices = new U32[numVertices];
@ -206,6 +206,42 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
return TRUE;
}
//-----------------------------------------------------------------------------
// freeData()
//-----------------------------------------------------------------------------
void LLPolyMorphData::freeData()
{
if (mCoords != NULL)
{
ll_aligned_free_16(mCoords);
mCoords = NULL;
}
if (mNormals != NULL)
{
ll_aligned_free_16(mNormals);
mNormals = NULL;
}
if (mBinormals != NULL)
{
ll_aligned_free_16(mBinormals);
mBinormals = NULL;
}
if (mTexCoords != NULL)
{
delete [] mTexCoords;
mTexCoords = NULL;
}
if (mVertexIndices != NULL)
{
delete [] mVertexIndices;
mVertexIndices = NULL;
}
}
//-----------------------------------------------------------------------------
// LLPolyMorphTargetInfo()
//-----------------------------------------------------------------------------

View File

@ -48,6 +48,16 @@ public:
~LLPolyMorphData();
LLPolyMorphData(const LLPolyMorphData &rhs);
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
}
BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh);
const std::string& getName() { return mName; }
@ -67,6 +77,9 @@ public:
F32 mMaxDistortion; // maximum single vertex distortion in a given morph
LLVector4a mAvgDistortion; // average vertex distortion, to infer directionality of the morph
LLPolyMeshSharedData* mMesh;
private:
void freeData();
};
//-----------------------------------------------------------------------------

View File

@ -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;
}

View File

@ -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(); }

View File

@ -510,7 +510,13 @@ void LLTexLayerSetBuffer::doUpload()
BOOL valid = FALSE;
LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
S32 file_size = 0;
U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size);
//data buffer MUST be allocated using LLImageBase
LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE);
file_size = file.getSize();
U8* data = integrity_test->allocateData(file_size);
file.read(data, file_size);
if (data)
{
valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data'

View File

@ -67,6 +67,16 @@ public:
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
}
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex avatar_sex ) {}
@ -143,6 +153,16 @@ public:
LLTexLayerParamColor( LLVOAvatar* avatar );
/* virtual */ ~LLTexLayerParamColor();
void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
}
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
// LLVisualParam Virtual functions

View File

@ -2977,7 +2977,9 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
~lcl_responder()
{
LL_CHECK_MEMORY
mFetcher->decrCurlPOSTCount();
LL_CHECK_MEMORY
}
// virtual

View File

@ -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.

View File

@ -5134,12 +5134,6 @@ class LLEditDelete : public view_listener_t
}
};
bool enable_object_return()
{
return (!LLSelectMgr::getInstance()->getSelection()->isEmpty() &&
(gAgent.isGodlike() || can_derez(DRD_RETURN_TO_OWNER)));
}
void handle_spellcheck_replace_with_suggestion(const LLUICtrl* ctrl, const LLSD& param)
{
const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
@ -5212,6 +5206,12 @@ bool enable_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
return (spellcheck_handler) && (spellcheck_handler->canAddToIgnore());
}
bool enable_object_return()
{
return (!LLSelectMgr::getInstance()->getSelection()->isEmpty() &&
(gAgent.isGodlike() || can_derez(DRD_RETURN_TO_OWNER)));
}
bool enable_object_delete()
{
bool new_value =

View File

@ -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:

View File

@ -237,6 +237,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mTimeDilation(1.f),
mRotTime(0.f),
mAngularVelocityRot(),
mPreviousRotation(),
mState(0),
mMedia(NULL),
mClickAction(0),
@ -784,7 +785,7 @@ BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
}
LLDrawable* old_parent = mDrawable->mParent;
mDrawable->mParent = parentp;
if (parentp && mDrawable->isActive())
{
parentp->makeActive();
@ -1410,9 +1411,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#else
val = (U16 *) &data[count];
#endif
setAngularVelocity( U16_to_F32(val[VX], -size, size),
new_angv.set(U16_to_F32(val[VX], -size, size),
U16_to_F32(val[VY], -size, size),
U16_to_F32(val[VZ], -size, size));
setAngularVelocity(new_angv);
break;
case 16:
@ -1436,9 +1438,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
setAngularVelocity( U8_to_F32(data[13], -size, size),
new_angv.set(U8_to_F32(data[13], -size, size),
U8_to_F32(data[14], -size, size),
U8_to_F32(data[15], -size, size) );
setAngularVelocity(new_angv);
break;
}
@ -1510,9 +1513,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
dp->unpackU16(val[VX], "AccX");
dp->unpackU16(val[VY], "AccY");
dp->unpackU16(val[VZ], "AccZ");
setAngularVelocity( U16_to_F32(val[VX], -64.f, 64.f),
new_angv.set(U16_to_F32(val[VX], -64.f, 64.f),
U16_to_F32(val[VY], -64.f, 64.f),
U16_to_F32(val[VZ], -64.f, 64.f));
setAngularVelocity(new_angv);
}
break;
case OUT_FULL_COMPRESSED:
@ -1556,8 +1560,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
if (value & 0x80)
{
dp->unpackVector3(vec, "Omega");
setAngularVelocity(vec);
dp->unpackVector3(new_angv, "Omega");
setAngularVelocity(new_angv);
}
if (value & 0x20)
@ -2038,12 +2042,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
if (new_rot != getRotation()
|| new_angv != old_angv)
if ((new_rot != getRotation())
|| (new_angv != old_angv))
{
if (new_angv != old_angv)
if (new_rot != mPreviousRotation)
{
resetRot();
}
else if (new_angv != old_angv)
{
if (flagUsePhysics())
if (flagUsePhysics() || new_angv.isExactlyZero())
{
resetRot();
}
@ -2053,6 +2061,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
// Remember the last rotation value
mPreviousRotation = new_rot;
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
setRotation(new_rot * mAngularVelocityRot);
setChanged(ROTATED | SILHOUETTE);
@ -2159,29 +2170,29 @@ void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
if (!mDead)
{
// CRO - don't velocity interp linked objects!
// Leviathan - but DO velocity interp joints
if (!mStatic && sVelocityInterpolate && !isSelected())
{
// calculate dt from last update
F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
F32 dt = mTimeDilation * dt_raw;
// CRO - don't velocity interp linked objects!
// Leviathan - but DO velocity interp joints
if (!mStatic && sVelocityInterpolate && !isSelected())
{
// calculate dt from last update
F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
F32 dt = mTimeDilation * dt_raw;
applyAngularVelocity(dt);
if (isAttachment())
{
mLastInterpUpdateSecs = time;
return;
}
else
{ // Move object based on it's velocity and rotation
interpolateLinearMotion(time, dt);
}
}
updateDrawable(FALSE);
if (isAttachment())
{
mLastInterpUpdateSecs = time;
return;
}
else
{ // Move object based on it's velocity and rotation
interpolateLinearMotion(time, dt);
}
}
updateDrawable(FALSE);
}
}
@ -5384,9 +5395,9 @@ void LLViewerObject::setPhysicsShapeType(U8 type)
mPhysicsShapeUnknown = false;
if (type != mPhysicsShapeType)
{
mPhysicsShapeType = type;
mCostStale = true;
}
mPhysicsShapeType = type;
mCostStale = true;
}
}
void LLViewerObject::setPhysicsGravity(F32 gravity)

View File

@ -725,6 +725,7 @@ protected:
F32 mTimeDilation; // Time dilation sent with the object.
F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations
LLQuaternion mPreviousRotation;
U8 mState; // legacy
LLViewerObjectMedia* mMedia; // NULL if no media associated

View File

@ -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:

View File

@ -2328,7 +2328,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
bound_shader = true;
gOcclusionCubeProgram.bind();
}
if (sUseOcclusion > 1)
{
if (mCubeVB.isNull())
@ -2506,7 +2506,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)
{
gOcclusionCubeProgram.bind();
}
}
}
if (mCubeVB.isNull())
{ //cube VB will be used for issuing occlusion queries
@ -2563,11 +2563,6 @@ void LLPipeline::updateGL()
glu->mInQ = FALSE;
LLGLUpdate::sGLQ.pop_front();
}
{ //seed VBO Pools
LLFastTimer t(FTM_SEED_VBO_POOLS);
LLVertexBuffer::seedPools();
}
}
{ //seed VBO Pools
@ -3376,11 +3371,11 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
}
}
}
}
}
}
void renderPhysicalBeacons(LLDrawable* drawablep)
{
@ -3405,11 +3400,11 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
}
}
}
}
}
}
void renderMOAPBeacons(LLDrawable* drawablep)
{
@ -3445,11 +3440,11 @@ void renderMOAPBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
}
}
}
}
}
}
void renderParticleBeacons(LLDrawable* drawablep)
{
@ -3474,11 +3469,11 @@ void renderParticleBeacons(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
}
}
}
}
}
}
void renderSoundHighlights(LLDrawable* drawablep)
{
@ -3496,11 +3491,11 @@ void renderSoundHighlights(LLDrawable* drawablep)
if (facep)
{
gPipeline.mHighlightFaces.push_back(facep);
}
}
}
}
}
}
void LLPipeline::postSort(LLCamera& camera)
{
@ -3713,7 +3708,7 @@ void LLPipeline::postSort(LLCamera& camera)
if (facep)
{
gPipeline.mSelectedFaces.push_back(facep);
}
}
}
return true;
}

View File

@ -21,6 +21,7 @@
<menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
<menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/>
<menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/>
<menu_item_call label="Kontoübersicht..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
</menu_item_call>

View File

@ -6,7 +6,7 @@
height="395"
width="1075"
min_height="395"
min_width="1075"
min_width="990"
layout="topleft"
name="floater_pathfinding_linksets"
help_topic="floater_pathfinding_linksets"
@ -524,7 +524,7 @@
tool_tip="Walkability for characters of type D. Example character type is other."
width="45" />
<button
follows="right|bottom"
follows="left|bottom"
height="21"
label="Apply changes"
layout="topleft"

View File

@ -134,16 +134,6 @@
top_delta="-25"
name="Pipette"
width="28" />
<check_box
follows="left|bottom"
height="20"
initial_value="true"
label="Live Preview"
layout="topleft"
left="4"
name="apply_immediate_check"
top="262"
width="120" />
<text
follows="left|bottom"
height="20"

View File

@ -7567,18 +7567,6 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]
name="LivePreviewUnavailable"
type="alert">
We cannot display a preview of this texture because it is no-copy and/or no-transfer.
<usetemplate
ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="LivePreviewUnavailable"
type="alert">
We cannot display a preview of this texture because it is no-copy and/or no-transfer.
<usetemplate
ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"

File diff suppressed because it is too large Load Diff

View File

@ -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) {}

View File

@ -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]
@ -1086,7 +1087,6 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
# KLUDGE: As of 2012-04-11, the 'fontconfig' package installs
# libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1
# and libfontconfig.so. Before we added support for library-file
@ -1105,7 +1105,13 @@ class Linux_i686Manifest(LinuxManifest):
# previous call did, without having to explicitly state the
# version number.
self.path("libfontconfig.so.*.*")
self.path("libtcmalloc.so*") #formerly called google perf tools
try:
self.path("libtcmalloc.so*") #formerly called google perf tools
pass
except:
print "tcmalloc files not found, skipping"
pass
try:
self.path("libfmod-3.75.so")
pass

View File

@ -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,

View File

@ -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;
};