00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llvocache.h"
00035
00036 #include "llerror.h"
00037
00038
00039
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
00087 if ((size > 10000) || (size < 1))
00088 {
00089
00090
00091
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
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
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 }