SL-684 Improve cache version guard
parent
aea3a9c18a
commit
654aead8a1
|
|
@ -31,6 +31,7 @@
|
|||
#include "llapr.h"
|
||||
#include "lldir.h"
|
||||
#include "llimage.h"
|
||||
#include "llimagej2c.h" // for version control
|
||||
#include "lllfsthread.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
|
|
@ -938,6 +939,14 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
|
|||
F32 LLTextureCache::sHeaderCacheVersion = 1.7f;
|
||||
U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.
|
||||
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
|
||||
std::string LLTextureCache::sHeaderCacheEncoderVersion = LLImageJ2C::getEngineInfo();
|
||||
|
||||
#if defined(ADDRESS_SIZE)
|
||||
U32 LLTextureCache::sHeaderCacheAddressSize = ADDRESS_SIZE;
|
||||
#else
|
||||
U32 LLTextureCache::sHeaderCacheAddressSize = 32;
|
||||
#endif
|
||||
|
||||
const char* entries_filename = "texture.entries";
|
||||
const char* cache_filename = "texture.cache";
|
||||
const char* old_textures_dirname = "textures";
|
||||
|
|
@ -1080,12 +1089,28 @@ void LLTextureCache::readEntriesHeader()
|
|||
}
|
||||
else //create an empty entries header.
|
||||
{
|
||||
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
|
||||
mHeaderEntriesInfo.mEntries = 0 ;
|
||||
setEntriesHeader();
|
||||
writeEntriesHeader() ;
|
||||
}
|
||||
}
|
||||
|
||||
void LLTextureCache::setEntriesHeader()
|
||||
{
|
||||
if (sHeaderEncoderStringSize < sHeaderCacheEncoderVersion.size() + 1)
|
||||
{
|
||||
// For simplicity we use predefined size of header, so if version string
|
||||
// doesn't fit, either getEngineInfo() returned malformed string or
|
||||
// sHeaderEncoderStringSize need to be increased.
|
||||
// Also take into accout that c_str() returns additional null character
|
||||
LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL;
|
||||
}
|
||||
|
||||
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
|
||||
mHeaderEntriesInfo.mAdressSize = sHeaderCacheAddressSize;
|
||||
strcpy(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str());
|
||||
mHeaderEntriesInfo.mEntries = 0;
|
||||
}
|
||||
|
||||
void LLTextureCache::writeEntriesHeader()
|
||||
{
|
||||
llassert_always(mHeaderAPRFile == NULL);
|
||||
|
|
@ -1439,7 +1464,9 @@ void LLTextureCache::readHeaderCache()
|
|||
|
||||
readEntriesHeader();
|
||||
|
||||
if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion)
|
||||
if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion
|
||||
|| mHeaderEntriesInfo.mAdressSize != sHeaderCacheAddressSize
|
||||
|| strcmp(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()) != 0)
|
||||
{
|
||||
if (!mReadOnly)
|
||||
{
|
||||
|
|
@ -1601,8 +1628,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
|
|||
mUpdatedEntryMap.clear();
|
||||
|
||||
// Info with 0 entries
|
||||
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
|
||||
mHeaderEntriesInfo.mEntries = 0;
|
||||
setEntriesHeader();
|
||||
writeEntriesHeader();
|
||||
|
||||
LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ;
|
||||
|
|
|
|||
|
|
@ -46,10 +46,13 @@ class LLTextureCache : public LLWorkerThread
|
|||
|
||||
private:
|
||||
// Entries
|
||||
static const U32 sHeaderEncoderStringSize = 32;
|
||||
struct EntriesInfo
|
||||
{
|
||||
EntriesInfo() : mVersion(0.f), mEntries(0) {}
|
||||
EntriesInfo() : mVersion(0.f), mAdressSize(0), mEntries(0) { memset(mEncoderVersion, 0, sHeaderEncoderStringSize); }
|
||||
F32 mVersion;
|
||||
U32 mAdressSize;
|
||||
char mEncoderVersion[sHeaderEncoderStringSize];
|
||||
U32 mEntries;
|
||||
};
|
||||
struct Entry
|
||||
|
|
@ -156,6 +159,7 @@ private:
|
|||
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
|
||||
void closeHeaderEntriesFile();
|
||||
void readEntriesHeader();
|
||||
void setEntriesHeader();
|
||||
void writeEntriesHeader();
|
||||
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
|
||||
bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
|
||||
|
|
@ -224,6 +228,8 @@ private:
|
|||
|
||||
// Statics
|
||||
static F32 sHeaderCacheVersion;
|
||||
static U32 sHeaderCacheAddressSize;
|
||||
static std::string sHeaderCacheEncoderVersion;
|
||||
static U32 sCacheMaxEntries;
|
||||
static S64 sCacheMaxTexturesSize;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1093,11 +1093,21 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
|
|||
}
|
||||
mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
|
||||
mMetaInfo.mVersion = cache_version;
|
||||
|
||||
#if defined(ADDRESS_SIZE)
|
||||
U32 expected_address = ADDRESS_SIZE;
|
||||
#else
|
||||
U32 expected_address = 32;
|
||||
#endif
|
||||
mMetaInfo.mAddressSize = expected_address;
|
||||
|
||||
readCacheHeader();
|
||||
|
||||
if(mMetaInfo.mVersion != cache_version)
|
||||
if( mMetaInfo.mVersion != cache_version
|
||||
|| mMetaInfo.mAddressSize != expected_address)
|
||||
{
|
||||
mMetaInfo.mVersion = cache_version ;
|
||||
mMetaInfo.mAddressSize = expected_address;
|
||||
if(mReadOnly) //disable cache
|
||||
{
|
||||
clearCacheInMemory();
|
||||
|
|
|
|||
|
|
@ -237,9 +237,10 @@ private:
|
|||
|
||||
struct HeaderMetaInfo
|
||||
{
|
||||
HeaderMetaInfo() : mVersion(0){}
|
||||
HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}
|
||||
|
||||
U32 mVersion;
|
||||
U32 mAddressSize;
|
||||
};
|
||||
|
||||
struct header_entry_less
|
||||
|
|
|
|||
Loading…
Reference in New Issue