llvocache.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llvocache.h"
00035 
00036 #include "llerror.h"
00037 
00038 //---------------------------------------------------------------------------
00039 // LLVOCacheEntry
00040 //---------------------------------------------------------------------------
00041 
00042 LLVOCacheEntry::LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp)
00043 {
00044         mLocalID = local_id;
00045         mCRC = crc;
00046         mHitCount = 0;
00047         mDupeCount = 0;
00048         mCRCChangeCount = 0;
00049         mBuffer = new U8[dp.getBufferSize()];
00050         mDP.assignBuffer(mBuffer, dp.getBufferSize());
00051         mDP = dp;
00052 }
00053 
00054 LLVOCacheEntry::LLVOCacheEntry()
00055 {
00056         mLocalID = 0;
00057         mCRC = 0;
00058         mHitCount = 0;
00059         mDupeCount = 0;
00060         mCRCChangeCount = 0;
00061         mBuffer = NULL;
00062         mDP.assignBuffer(mBuffer, 0);
00063 }
00064 
00065 
00066 static inline void checkedRead(FILE *fp, void *data, size_t nbytes)
00067 {
00068         if (fread(data, 1, nbytes, fp) != nbytes)
00069         {
00070                 llwarns << "Short read" << llendl;
00071                 memset(data, 0, nbytes);
00072         }
00073 }
00074 
00075 LLVOCacheEntry::LLVOCacheEntry(FILE *fp)
00076 {
00077         S32 size;
00078         checkedRead(fp, &mLocalID, sizeof(U32));
00079         checkedRead(fp, &mCRC, sizeof(U32));
00080         checkedRead(fp, &mHitCount, sizeof(S32));
00081         checkedRead(fp, &mDupeCount, sizeof(S32));
00082         checkedRead(fp, &mCRCChangeCount, sizeof(S32));
00083 
00084         checkedRead(fp, &size, sizeof(S32));
00085 
00086         // Corruption in the cache entries
00087         if ((size > 10000) || (size < 1))
00088         {
00089                 // We've got a bogus size, skip reading it.
00090                 // We won't bother seeking, because the rest of this file
00091                 // is likely bogus, and will be tossed anyway.
00092                 llwarns << "Bogus cache entry, size " << size << ", aborting!" << llendl;
00093                 mLocalID = 0;
00094                 mCRC = 0;
00095                 mBuffer = NULL;
00096                 return;
00097         }
00098 
00099         mBuffer = new U8[size];
00100         checkedRead(fp, mBuffer, size);
00101         mDP.assignBuffer(mBuffer, size);
00102 }
00103 
00104 LLVOCacheEntry::~LLVOCacheEntry()
00105 {
00106         delete [] mBuffer;
00107 }
00108 
00109 
00110 // New CRC means the object has changed.
00111 void LLVOCacheEntry::assignCRC(U32 crc, LLDataPackerBinaryBuffer &dp)
00112 {
00113         if (  (mCRC != crc)
00114                 ||(mDP.getBufferSize() == 0))
00115         {
00116                 mCRC = crc;
00117                 mHitCount = 0;
00118                 mCRCChangeCount++;
00119 
00120                 mDP.freeBuffer();
00121                 mBuffer = new U8[dp.getBufferSize()];
00122                 mDP.assignBuffer(mBuffer, dp.getBufferSize());
00123                 mDP = dp;
00124         }
00125 }
00126 
00127 LLDataPackerBinaryBuffer *LLVOCacheEntry::getDP(U32 crc)
00128 {
00129         if (  (mCRC != crc)
00130                 ||(mDP.getBufferSize() == 0))
00131         {
00132                 //llinfos << "Not getting cache entry, invalid!" << llendl;
00133                 return NULL;
00134         }
00135         mHitCount++;
00136         return &mDP;
00137 }
00138 
00139 
00140 void LLVOCacheEntry::recordHit()
00141 {
00142         mHitCount++;
00143 }
00144 
00145 
00146 void LLVOCacheEntry::dump() const
00147 {
00148         llinfos << "local " << mLocalID
00149                 << " crc " << mCRC
00150                 << " hits " << mHitCount
00151                 << " dupes " << mDupeCount
00152                 << " change " << mCRCChangeCount
00153                 << llendl;
00154 }
00155 
00156 static inline void checkedWrite(FILE *fp, const void *data, size_t nbytes)
00157 {
00158         if (fwrite(data, 1, nbytes, fp) != nbytes)
00159         {
00160                 llwarns << "Short write" << llendl;
00161         }
00162 }
00163 
00164 void LLVOCacheEntry::writeToFile(FILE *fp) const
00165 {
00166         checkedWrite(fp, &mLocalID, sizeof(U32));
00167         checkedWrite(fp, &mCRC, sizeof(U32));
00168         checkedWrite(fp, &mHitCount, sizeof(S32));
00169         checkedWrite(fp, &mDupeCount, sizeof(S32));
00170         checkedWrite(fp, &mCRCChangeCount, sizeof(S32));
00171         S32 size = mDP.getBufferSize();
00172         checkedWrite(fp, &size, sizeof(S32));
00173         checkedWrite(fp, mBuffer, size);
00174 }

Generated on Thu Jul 1 06:09:36 2010 for Second Life Viewer by  doxygen 1.4.7