diff options
author | Callum Prentice <callum@gmail.com> | 2020-09-11 10:00:17 -0700 |
---|---|---|
committer | Callum Prentice <callum@gmail.com> | 2020-09-11 10:00:17 -0700 |
commit | 8c289ec126edf510a542c86e4c9df1787a37acb6 (patch) | |
tree | dfe5c9811c0b6b4e3aa3ad21dbb17c259814adc4 | |
parent | e8b31d03b4f6f0ffb981b4ea150743daf7b4a958 (diff) |
Effective rename of DRTVWR-506-simple since there is no way to rename a branch. Cloned canonical viewer into DRTVWR-519, copied over the files that changed from DRTVWR-506-simple and pushed back. Once I am satisfied everything is correct, DRTVWR-506-simple will be removed
-rw-r--r-- | autobuild.xml | 6 | ||||
-rw-r--r-- | indra/cmake/00-Common.cmake | 10 | ||||
-rw-r--r-- | indra/llcommon/llerror.cpp | 61 | ||||
-rw-r--r-- | indra/llvfs/llvfile.cpp | 751 | ||||
-rw-r--r-- | indra/llvfs/llvfile.h | 19 | ||||
-rw-r--r-- | indra/newview/llappviewerwin32.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llviewerstats.cpp | 2 |
7 files changed, 561 insertions, 290 deletions
diff --git a/autobuild.xml b/autobuild.xml index 51515b3696..c9fb9cd4e9 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2187,16 +2187,16 @@ <key>archive</key> <map> <key>hash</key> - <string>8501cbaa7e0f254614694da784a9c61c</string> + <string>b677ee43822212f0a27c838dc8bf3623</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2</string> </map> <key>name</key> <string>common</string> </map> </map> <key>version</key> - <string>202008010216.546021</string> + <string>202009010215.548269</string> </map> <key>llphysicsextensions_source</key> <map> diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 865c057e33..9f8ee34034 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -63,8 +63,14 @@ if (WINDOWS) # Without PreferredToolArchitecture=x64, as of 2020-06-26 the 32-bit # compiler on our TeamCity build hosts has started running out of virtual # memory for the precompiled header file. - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /p:PreferredToolArchitecture=x64") - + # CP changed to only append the flag for 32bit builds - on 64bit builds, + # locally at least, the build output is spammed with 1000s of 'D9002' + # warnings about this switch being ignored. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + if( ADDRESS_SIZE EQUAL 32 ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /p:PreferredToolArchitecture=x64") + endif() + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zo" CACHE STRING "C++ compiler release-with-debug options" FORCE) diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 411412c883..832813ba3f 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -194,23 +194,64 @@ namespace { { return LLError::getEnabledLogTypesMask() & 0x04; } - + + LL_FORCE_INLINE std::string createBoldANSI() + { + std::string ansi_code; + ansi_code += '\033'; + ansi_code += "["; + ansi_code += "1"; + ansi_code += "m"; + + return ansi_code; + } + + LL_FORCE_INLINE std::string createResetANSI() + { + std::string ansi_code; + ansi_code += '\033'; + ansi_code += "["; + ansi_code += "0"; + ansi_code += "m"; + + return ansi_code; + } + LL_FORCE_INLINE std::string createANSI(const std::string& color) { std::string ansi_code; - ansi_code += '\033'; - ansi_code += "["; - ansi_code += color; + ansi_code += '\033'; + ansi_code += "["; + ansi_code += "38;5;"; + ansi_code += color; ansi_code += "m"; + return ansi_code; } virtual void recordMessage(LLError::ELevel level, const std::string& message) override { - static std::string s_ansi_error = createANSI("31"); // red - static std::string s_ansi_warn = createANSI("34"); // blue - static std::string s_ansi_debug = createANSI("35"); // magenta + // The default colors for error, warn and debug are now a bit more pastel + // and easier to read on the default (black) terminal background but you + // now have the option to set the color of each via an environment variables: + // LL_ANSI_ERROR_COLOR_CODE (default is red) + // LL_ANSI_WARN_COLOR_CODE (default is blue) + // LL_ANSI_DEBUG_COLOR_CODE (default is magenta) + // The list of color codes can be found in many places but I used this page: + // https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html#256-colors + // (Note: you may need to restart Visual Studio to pick environment changes) + char* val = nullptr; + std::string s_ansi_error_code = "160"; + if ((val = getenv("LL_ANSI_ERROR_COLOR_CODE")) != nullptr) s_ansi_error_code = std::string(val); + std::string s_ansi_warn_code = "33"; + if ((val = getenv("LL_ANSI_WARN_COLOR_CODE")) != nullptr) s_ansi_warn_code = std::string(val); + std::string s_ansi_debug_code = "177"; + if ((val = getenv("LL_ANSI_DEBUG_COLOR_CODE")) != nullptr) s_ansi_debug_code = std::string(val); + + static std::string s_ansi_error = createANSI(s_ansi_error_code); // default is red + static std::string s_ansi_warn = createANSI(s_ansi_warn_code); // default is blue + static std::string s_ansi_debug = createANSI(s_ansi_debug_code); // default is magenta if (mUseANSI) { @@ -229,11 +270,11 @@ namespace { LL_FORCE_INLINE void writeANSI(const std::string& ansi_code, const std::string& message) { - static std::string s_ansi_bold = createANSI("1"); // bold - static std::string s_ansi_reset = createANSI("0"); // reset + static std::string s_ansi_bold = createBoldANSI(); // bold text + static std::string s_ansi_reset = createResetANSI(); // reset // ANSI color code escape sequence, message, and reset in one fprintf call // Default all message levels to bold so we can distinguish our own messages from those dumped by subprocesses and libraries. - fprintf(stderr, "%s%s%s\n%s", s_ansi_bold.c_str(), ansi_code.c_str(), message.c_str(), s_ansi_reset.c_str() ); + fprintf(stderr, "%s%s\n%s", ansi_code.c_str(), message.c_str(), s_ansi_reset.c_str() ); } static bool checkANSI(void) diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp index b8588e99f4..797b431b93 100644 --- a/indra/llvfs/llvfile.cpp +++ b/indra/llvfs/llvfile.cpp @@ -35,6 +35,9 @@ #include "llmemory.h" #include "llvfs.h" +#include <fstream> +#include "lldir.h" + const S32 LLVFile::READ = 0x00000001; const S32 LLVFile::WRITE = 0x00000002; const S32 LLVFile::READ_WRITE = 0x00000003; // LLVFile::READ & LLVFile::WRITE @@ -43,8 +46,8 @@ const S32 LLVFile::APPEND = 0x00000006; // 0x00000004 & LLVFile::WRITE static LLTrace::BlockTimerStatHandle FTM_VFILE_WAIT("VFile Wait"); //---------------------------------------------------------------------------- -LLVFSThread* LLVFile::sVFSThread = NULL; -BOOL LLVFile::sAllocdVFSThread = FALSE; +//CP LLVFSThread* LLVFile::sVFSThread = NULL; +//CP BOOL LLVFile::sAllocdVFSThread = FALSE; //---------------------------------------------------------------------------- //============================================================================ @@ -52,137 +55,256 @@ BOOL LLVFile::sAllocdVFSThread = FALSE; LLVFile::LLVFile(LLVFS *vfs, const LLUUID &file_id, const LLAssetType::EType file_type, S32 mode) { mFileType = file_type; - mFileID = file_id; mPosition = 0; + mBytesRead = 0; + mReadComplete = FALSE; mMode = mode; - mVFS = vfs; + //CP mVFS = vfs; - mBytesRead = 0; - mHandle = LLVFSThread::nullHandle(); - mPriority = 128.f; + //CP mHandle = LLVFSThread::nullHandle(); + //CP mPriority = 128.f; - mVFS->incLock(mFileID, mFileType, VFSLOCK_OPEN); + //CP mVFS->incLock(mFileID, mFileType, VFSLOCK_OPEN); } LLVFile::~LLVFile() { - if (!isReadComplete()) - { - if (mHandle != LLVFSThread::nullHandle()) - { - if (!(mMode & LLVFile::WRITE)) - { - //LL_WARNS() << "Destroying LLVFile with pending async read/write, aborting..." << LL_ENDL; - sVFSThread->setFlags(mHandle, LLVFSThread::FLAG_AUTO_COMPLETE | LLVFSThread::FLAG_ABORT); - } - else // WRITE - { - sVFSThread->setFlags(mHandle, LLVFSThread::FLAG_AUTO_COMPLETE); - } - } - } - mVFS->decLock(mFileID, mFileType, VFSLOCK_OPEN); + //CP BEGIN + //if (!isReadComplete()) + //{ + // if (mHandle != LLVFSThread::nullHandle()) + // { + // if (!(mMode & LLVFile::WRITE)) + // { + // //LL_WARNS() << "Destroying LLVFile with pending async read/write, aborting..." << LL_ENDL; + // sVFSThread->setFlags(mHandle, LLVFSThread::FLAG_AUTO_COMPLETE | LLVFSThread::FLAG_ABORT); + // } + // else // WRITE + // { + // sVFSThread->setFlags(mHandle, LLVFSThread::FLAG_AUTO_COMPLETE); + // } + // } + //} + //mVFS->decLock(mFileID, mFileType, VFSLOCK_OPEN); + //CP END +} + +const std::string assetTypeToString(LLAssetType::EType at) +{ + /** + * Make use of the C++17 (or is it 14) feature that allows + * for inline initialization of an std::map<> + */ + typedef std::map<LLAssetType::EType, std::string> asset_type_to_name_t; + asset_type_to_name_t asset_type_to_name = + { + { LLAssetType::AT_TEXTURE, "TEXTURE" }, + { LLAssetType::AT_SOUND, "SOUND" }, + { LLAssetType::AT_CALLINGCARD, "CALLINGCARD" }, + { LLAssetType::AT_LANDMARK, "LANDMARK" }, + { LLAssetType::AT_SCRIPT, "SCRIPT" }, + { LLAssetType::AT_CLOTHING, "CLOTHING" }, + { LLAssetType::AT_OBJECT, "OBJECT" }, + { LLAssetType::AT_NOTECARD, "NOTECARD" }, + { LLAssetType::AT_CATEGORY, "CATEGORY" }, + { LLAssetType::AT_LSL_TEXT, "LSL_TEXT" }, + { LLAssetType::AT_LSL_BYTECODE, "LSL_BYTECODE" }, + { LLAssetType::AT_TEXTURE_TGA, "TEXTURE_TGA" }, + { LLAssetType::AT_BODYPART, "BODYPART" }, + { LLAssetType::AT_SOUND_WAV, "SOUND_WAV" }, + { LLAssetType::AT_IMAGE_TGA, "IMAGE_TGA" }, + { LLAssetType::AT_IMAGE_JPEG, "IMAGE_JPEG" }, + { LLAssetType::AT_ANIMATION, "ANIMATION" }, + { LLAssetType::AT_GESTURE, "GESTURE" }, + { LLAssetType::AT_SIMSTATE, "SIMSTATE" }, + { LLAssetType::AT_LINK, "LINK" }, + { LLAssetType::AT_LINK_FOLDER, "LINK_FOLDER" }, + { LLAssetType::AT_MARKETPLACE_FOLDER, "MARKETPLACE_FOLDER" }, + { LLAssetType::AT_WIDGET, "WIDGET" }, + { LLAssetType::AT_PERSON, "PERSON" }, + { LLAssetType::AT_MESH, "MESH" }, + { LLAssetType::AT_UNKNOWN, "UNKNOWN" } + }; + + asset_type_to_name_t::iterator iter = asset_type_to_name.find(at); + if (iter != asset_type_to_name.end()) + { + return iter->second; + } + + return std::string("UNKNOWN"); +} + +const std::string idToFilepath(const std::string id, LLAssetType::EType at) +{ + /** + * For the moment this is just {UUID}_{ASSET_TYPE}.txt but of + * course, will be greatly expanded upon + */ + std::ostringstream ss; + ss << "00vfs_"; + ss << id; + ss << "_"; + ss << assetTypeToString(at); + ss << ".txt"; + + const std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ss.str()); + + return filepath; } BOOL LLVFile::read(U8 *buffer, S32 bytes, BOOL async, F32 priority) { - if (! (mMode & READ)) - { - LL_WARNS() << "Attempt to read from file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; - return FALSE; - } + //CP BEGIN + //if (! (mMode & READ)) + //{ + // LL_WARNS() << "Attempt to read from file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; + // return FALSE; + //} + + //if (mHandle != LLVFSThread::nullHandle()) + //{ + // LL_WARNS() << "Attempt to read from vfile object " << mFileID << " with pending async operation" << LL_ENDL; + // return FALSE; + //} + //mPriority = priority; + //CP END - if (mHandle != LLVFSThread::nullHandle()) - { - LL_WARNS() << "Attempt to read from vfile object " << mFileID << " with pending async operation" << LL_ENDL; - return FALSE; - } - mPriority = priority; - BOOL success = TRUE; + mReadComplete = FALSE; + + std::string id; + mFileID.toString(id); + const std::string filename = idToFilepath(id, mFileType); + + std::ifstream file(filename, std::ios::binary); + if (file.is_open()) + { + file.seekg(mPosition, std::ios::beg); + + file.read((char*)buffer, bytes); + + if (file) + { + mBytesRead = bytes; + } + else + { + mBytesRead = file.gcount(); + } + + file.close(); + + mPosition += mBytesRead; + if (!mBytesRead) + { + success = FALSE; + } + + mReadComplete = TRUE; + } + + return success; + // We can't do a read while there are pending async writes - waitForLock(VFSLOCK_APPEND); - - // *FIX: (?) - if (async) - { - mHandle = sVFSThread->read(mVFS, mFileID, mFileType, buffer, mPosition, bytes, threadPri()); - } - else - { - // We can't do a read while there are pending async writes on this file - mBytesRead = sVFSThread->readImmediate(mVFS, mFileID, mFileType, buffer, mPosition, bytes); - mPosition += mBytesRead; - if (! mBytesRead) - { - success = FALSE; - } - } + //CP waitForLock(VFSLOCK_APPEND); - return success; + //CP BEGIN + // *FIX: (?) + //if (async) + //{ + // mHandle = sVFSThread->read(mVFS, mFileID, mFileType, buffer, mPosition, bytes, threadPri()); + //} + //else + //{ + // // We can't do a read while there are pending async writes on this file + // mBytesRead = sVFSThread->readImmediate(mVFS, mFileID, mFileType, buffer, mPosition, bytes); + // mPosition += mBytesRead; + // if (! mBytesRead) + // { + // success = FALSE; + // } + //} + + //return success; + + //CP END } -//static -U8* LLVFile::readFile(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, S32* bytes_read) -{ - U8 *data; - LLVFile file(vfs, uuid, type, LLVFile::READ); - S32 file_size = file.getSize(); - if (file_size == 0) - { - // File is empty. - data = NULL; - } - else - { - data = (U8*) ll_aligned_malloc<16>(file_size); - file.read(data, file_size); /* Flawfinder: ignore */ - - if (file.getLastBytesRead() != (S32)file_size) - { - ll_aligned_free<16>(data); - data = NULL; - file_size = 0; - } - } - if (bytes_read) - { - *bytes_read = file_size; - } - return data; -} - -void LLVFile::setReadPriority(const F32 priority) -{ - mPriority = priority; - if (mHandle != LLVFSThread::nullHandle()) - { - sVFSThread->setPriority(mHandle, threadPri()); - } -} +//CP BEGIN +////static +//U8* LLVFile::readFile(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, S32* bytes_read) +//{ +// U8 *data; +// LLVFile file(vfs, uuid, type, LLVFile::READ); +// S32 file_size = file.getSize(); +// if (file_size == 0) +// { +// // File is empty. +// data = NULL; +// } +// else +// { +// data = (U8*) ll_aligned_malloc<16>(file_size); +// file.read(data, file_size); /* Flawfinder: ignore */ +// +// if (file.getLastBytesRead() != (S32)file_size) +// { +// ll_aligned_free<16>(data); +// data = NULL; +// file_size = 0; +// } +// } +// if (bytes_read) +// { +// *bytes_read = file_size; +// } +// return data; +//} +//CP END + +//CP BEGIN +//void LLVFile::setReadPriority(const F32 priority) +//{ +// mPriority = priority; +// if (mHandle != LLVFSThread::nullHandle()) +// { +// sVFSThread->setPriority(mHandle, threadPri()); +// } +//} +//CP END BOOL LLVFile::isReadComplete() { - BOOL res = TRUE; - if (mHandle != LLVFSThread::nullHandle()) - { - LLVFSThread::Request* req = (LLVFSThread::Request*)sVFSThread->getRequest(mHandle); - LLVFSThread::status_t status = req->getStatus(); - if (status == LLVFSThread::STATUS_COMPLETE) - { - mBytesRead = req->getBytesRead(); - mPosition += mBytesRead; - sVFSThread->completeRequest(mHandle); - mHandle = LLVFSThread::nullHandle(); - } - else - { - res = FALSE; - } - } - return res; + if (mReadComplete) + { + return TRUE; + } + + return FALSE; + + //CP BEGIN + //BOOL res = TRUE; + //if (mHandle != LLVFSThread::nullHandle()) + //{ + // LLVFSThread::Request* req = (LLVFSThread::Request*)sVFSThread->getRequest(mHandle); + // LLVFSThread::status_t status = req->getStatus(); + // if (status == LLVFSThread::STATUS_COMPLETE) + // { + // mBytesRead = req->getBytesRead(); + // mPosition += mBytesRead; + // sVFSThread->completeRequest(mHandle); + // mHandle = LLVFSThread::nullHandle(); + // } + // else + // { + // res = FALSE; + // } + //} + //return res; + //CP END } S32 LLVFile::getLastBytesRead() @@ -197,48 +319,81 @@ BOOL LLVFile::eof() BOOL LLVFile::write(const U8 *buffer, S32 bytes) { - if (! (mMode & WRITE)) - { - LL_WARNS() << "Attempt to write to file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; - } - if (mHandle != LLVFSThread::nullHandle()) - { - LL_ERRS() << "Attempt to write to vfile object " << mFileID << " with pending async operation" << LL_ENDL; - return FALSE; - } - BOOL success = TRUE; - - // *FIX: allow async writes? potential problem wit mPosition... - if (mMode == APPEND) // all appends are async (but WRITEs are not) - { - U8* writebuf = new U8[bytes]; - memcpy(writebuf, buffer, bytes); - S32 offset = -1; - mHandle = sVFSThread->write(mVFS, mFileID, mFileType, - writebuf, offset, bytes, - LLVFSThread::FLAG_AUTO_COMPLETE | LLVFSThread::FLAG_AUTO_DELETE); - mHandle = LLVFSThread::nullHandle(); // FLAG_AUTO_COMPLETE means we don't track this - } - else - { - // We can't do a write while there are pending reads or writes on this file - waitForLock(VFSLOCK_READ); - waitForLock(VFSLOCK_APPEND); - - S32 pos = (mMode & APPEND) == APPEND ? -1 : mPosition; - - S32 wrote = sVFSThread->writeImmediate(mVFS, mFileID, mFileType, (U8*)buffer, pos, bytes); - - mPosition += wrote; - - if (wrote < bytes) - { - LL_WARNS() << "Tried to write " << bytes << " bytes, actually wrote " << wrote << LL_ENDL; - - success = FALSE; - } - } - return success; + std::string id_str; + mFileID.toString(id_str); + const std::string filename = idToFilepath(id_str, mFileType); + + BOOL success = FALSE; + + if (mMode == APPEND) + { + std::ofstream ofs(filename, std::ios::app | std::ios::binary); + if (ofs) + { + ofs.write((const char*)buffer, bytes); + + success = TRUE; + } + } + else + { + std::ofstream ofs(filename, std::ios::binary); + if (ofs) + { + ofs.write((const char*)buffer, bytes); + + mPosition += bytes; + + success = TRUE; + } + } + + return success; + + //CP BEGIN + //if (! (mMode & WRITE)) + //{ + // LL_WARNS() << "Attempt to write to file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; + //} + //if (mHandle != LLVFSThread::nullHandle()) + //{ + // LL_ERRS() << "Attempt to write to vfile object " << mFileID << " with pending async operation" << LL_ENDL; + // return FALSE; + //} + //BOOL success = TRUE; + // + //// *FIX: allow async writes? potential problem wit mPosition... + //if (mMode == APPEND) // all appends are async (but WRITEs are not) + //{ + // U8* writebuf = new U8[bytes]; + // memcpy(writebuf, buffer, bytes); + // S32 offset = -1; + // mHandle = sVFSThread->write(mVFS, mFileID, mFileType, + // writebuf, offset, bytes, + // LLVFSThread::FLAG_AUTO_COMPLETE | LLVFSThread::FLAG_AUTO_DELETE); + // mHandle = LLVFSThread::nullHandle(); // FLAG_AUTO_COMPLETE means we don't track this + //} + //else + //{ + // // We can't do a write while there are pending reads or writes on this file + // waitForLock(VFSLOCK_READ); + // waitForLock(VFSLOCK_APPEND); + + // S32 pos = (mMode & APPEND) == APPEND ? -1 : mPosition; + + // S32 wrote = sVFSThread->writeImmediate(mVFS, mFileID, mFileType, (U8*)buffer, pos, bytes); + + // mPosition += wrote; + // + // if (wrote < bytes) + // { + // LL_WARNS() << "Tried to write " << bytes << " bytes, actually wrote " << wrote << LL_ENDL; + + // success = FALSE; + // } + //} + //return success; + //CP END } //static @@ -251,11 +406,13 @@ BOOL LLVFile::writeFile(const U8 *buffer, S32 bytes, LLVFS *vfs, const LLUUID &u BOOL LLVFile::seek(S32 offset, S32 origin) { - if (mMode == APPEND) - { - LL_WARNS() << "Attempt to seek on append-only file" << LL_ENDL; - return FALSE; - } + //CP BEG + //if (mMode == APPEND) + //{ + // LL_WARNS() << "Attempt to seek on append-only file" << LL_ENDL; + // return FALSE; + //} + //CP END if (-1 == origin) { @@ -292,146 +449,212 @@ S32 LLVFile::tell() const S32 LLVFile::getSize() { - waitForLock(VFSLOCK_APPEND); - S32 size = mVFS->getSize(mFileID, mFileType); - - return size; + std::string id_str; + mFileID.toString(id_str); + const std::string filename = idToFilepath(id_str, mFileType); + + S32 file_size = 0; + std::ifstream file(filename, std::ios::binary); + if (file.is_open()) + { + file.seekg(0, std::ios::end); + file_size = file.tellg(); + } + return file_size; + + //CP BEG + //waitForLock(VFSLOCK_APPEND); + //S32 size = mVFS->getSize(mFileID, mFileType); + + //return size; + //CP END } S32 LLVFile::getMaxSize() { - S32 size = mVFS->getMaxSize(mFileID, mFileType); + // offer up a huge size since we don't care what the max is + return INT_MAX; + + //CP BEG + //S32 size = mVFS->getMaxSize(mFileID, mFileType); - return size; + //return size; + //CP END } BOOL LLVFile::setMaxSize(S32 size) { - if (! (mMode & WRITE)) - { - LL_WARNS() << "Attempt to change size of file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; - - return FALSE; - } - - if (!mVFS->checkAvailable(size)) - { - //LL_RECORD_BLOCK_TIME(FTM_VFILE_WAIT); - S32 count = 0; - while (sVFSThread->getPending() > 1000) - { - if (count % 100 == 0) - { - LL_INFOS() << "VFS catching up... Pending: " << sVFSThread->getPending() << LL_ENDL; - } - if (sVFSThread->isPaused()) - { - sVFSThread->update(0); - } - ms_sleep(10); - } - } - return mVFS->setMaxSize(mFileID, mFileType, size); + // we don't care what the max size is so we do nothing + // and return true to indicate all was okay + return TRUE; + + //CP BEG + //if (! (mMode & WRITE)) + //{ + // LL_WARNS() << "Attempt to change size of file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; + + // return FALSE; + //} + + //if (!mVFS->checkAvailable(size)) + //{ + // //LL_RECORD_BLOCK_TIME(FTM_VFILE_WAIT); + // S32 count = 0; + // while (sVFSThread->getPending() > 1000) + // { + // if (count % 100 == 0) + // { + // LL_INFOS() << "VFS catching up... Pending: " << sVFSThread->getPending() << LL_ENDL; + // } + // if (sVFSThread->isPaused()) + // { + // sVFSThread->update(0); + // } + // ms_sleep(10); + // } + //} + //return mVFS->setMaxSize(mFileID, mFileType, size); + //CP END } BOOL LLVFile::rename(const LLUUID &new_id, const LLAssetType::EType new_type) { - if (! (mMode & WRITE)) - { - LL_WARNS() << "Attempt to rename file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; - - return FALSE; - } - - if (mHandle != LLVFSThread::nullHandle()) - { - LL_WARNS() << "Renaming file with pending async read" << LL_ENDL; - } - - waitForLock(VFSLOCK_READ); - waitForLock(VFSLOCK_APPEND); - - // we need to release / replace our own lock - // since the renamed file will inherit locks from the new name - mVFS->decLock(mFileID, mFileType, VFSLOCK_OPEN); - mVFS->renameFile(mFileID, mFileType, new_id, new_type); - mVFS->incLock(new_id, new_type, VFSLOCK_OPEN); - - mFileID = new_id; - mFileType = new_type; - - return TRUE; + std::string old_id_str; + mFileID.toString(old_id_str); + const std::string old_filename = idToFilepath(old_id_str, mFileType); + + std::string new_id_str; + new_id.toString(new_id_str); + const std::string new_filename = idToFilepath(new_id_str, new_type); + + if (std::rename(old_filename.c_str(), new_filename.c_str())) + { + // We would like to return FALSE here indicating the operation + // failed but the original code does not and doing so seems to + // break a lot of things so we go with the flow... + //return FALSE; + } + mFileID = new_id; + mFileType = new_type; + + return TRUE; + //CP BEG + //if (! (mMode & WRITE)) + //{ + // LL_WARNS() << "Attempt to rename file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; + + // return FALSE; + //} + + //if (mHandle != LLVFSThread::nullHandle()) + //{ + // LL_WARNS() << "Renaming file with pending async read" << LL_ENDL; + //} + + //waitForLock(VFSLOCK_READ); + //waitForLock(VFSLOCK_APPEND); + + //// we need to release / replace our own lock + //// since the renamed file will inherit locks from the new name + //mVFS->decLock(mFileID, mFileType, VFSLOCK_OPEN); + //mVFS->renameFile(mFileID, mFileType, new_id, new_type); + //mVFS->incLock(new_id, new_type, VFSLOCK_OPEN); + // + //mFileID = new_id; + //mFileType = new_type; + + //return TRUE; + //CP END } BOOL LLVFile::remove() { -// LL_INFOS() << "Removing file " << mFileID << LL_ENDL; - - if (! (mMode & WRITE)) - { - // Leaving paranoia warning just because this should be a very infrequent - // operation. - LL_WARNS() << "Remove file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; - } - - if (mHandle != LLVFSThread::nullHandle()) - { - LL_WARNS() << "Removing file with pending async read" << LL_ENDL; - } - - // why not seek back to the beginning of the file too? - mPosition = 0; - - waitForLock(VFSLOCK_READ); - waitForLock(VFSLOCK_APPEND); - mVFS->removeFile(mFileID, mFileType); - - return TRUE; + std::string id_str; + mFileID.toString(id_str); + const std::string filename = idToFilepath(id_str, mFileType); + + std::remove(filename.c_str()); + // TODO: check if file was not removed and return false - maybe we don't care? + + return TRUE; + + //CP BEG + // LL_INFOS() << "Removing file " << mFileID << LL_ENDL; + //if (! (mMode & WRITE)) + //{ + // // Leaving paranoia warning just because this should be a very infrequent + // // operation. + // LL_WARNS() << "Remove file " << mFileID << " opened with mode " << std::hex << mMode << std::dec << LL_ENDL; + //} + + //if (mHandle != LLVFSThread::nullHandle()) + //{ + // LL_WARNS() << "Removing file with pending async read" << LL_ENDL; + //} + // + //// why not seek back to the beginning of the file too? + //mPosition = 0; + + //waitForLock(VFSLOCK_READ); + //waitForLock(VFSLOCK_APPEND); + //mVFS->removeFile(mFileID, mFileType); + + //return TRUE; + //CP END } // static void LLVFile::initClass(LLVFSThread* vfsthread) { - if (!vfsthread) - { - if (LLVFSThread::sLocal != NULL) - { - vfsthread = LLVFSThread::sLocal; - } - else - { - vfsthread = new LLVFSThread(); - sAllocdVFSThread = TRUE; - } - } - sVFSThread = vfsthread; + //CP BEG + //if (!vfsthread) + //{ + // if (LLVFSThread::sLocal != NULL) + // { + // vfsthread = LLVFSThread::sLocal; + // } + // else + // { + // vfsthread = new LLVFSThread(); + // sAllocdVFSThread = TRUE; + // } + //} + //sVFSThread = vfsthread; + //CP END } // static void LLVFile::cleanupClass() { - if (sAllocdVFSThread) - { - delete sVFSThread; - } - sVFSThread = NULL; + //CP BEG + //if (sAllocdVFSThread) + //{ + // delete sVFSThread; + //} + //sVFSThread = NULL; + //CP END } bool LLVFile::isLocked(EVFSLock lock) { - return mVFS->isLocked(mFileID, mFileType, lock) ? true : false; + // I don't think we care about this test since there is no locking + return FALSE; + + //CP return mVFS->isLocked(mFileID, mFileType, lock) ? true : false; } void LLVFile::waitForLock(EVFSLock lock) { - //LL_RECORD_BLOCK_TIME(FTM_VFILE_WAIT); - // spin until the lock clears - while (isLocked(lock)) - { - if (sVFSThread->isPaused()) - { - sVFSThread->update(0); - } - ms_sleep(1); - } + //CP BEG + ////LL_RECORD_BLOCK_TIME(FTM_VFILE_WAIT); + //// spin until the lock clears + //while (isLocked(lock)) + //{ + // if (sVFSThread->isPaused()) + // { + // sVFSThread->update(0); + // } + // ms_sleep(1); + //} + //CP END } diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h index 7e9d9f73e5..4aeb9c9630 100644 --- a/indra/llvfs/llvfile.h +++ b/indra/llvfs/llvfile.h @@ -39,8 +39,8 @@ public: ~LLVFile(); BOOL read(U8 *buffer, S32 bytes, BOOL async = FALSE, F32 priority = 128.f); /* Flawfinder: ignore */ - static U8* readFile(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, S32* bytes_read = 0); - void setReadPriority(const F32 priority); + //CP static U8* readFile(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, S32* bytes_read = 0); + //CP void setReadPriority(const F32 priority); BOOL isReadComplete(); S32 getLastBytesRead(); BOOL eof(); @@ -61,12 +61,12 @@ public: static void initClass(LLVFSThread* vfsthread = NULL); static void cleanupClass(); - static LLVFSThread* getVFSThread() { return sVFSThread; } + //CP static LLVFSThread* getVFSThread() { return sVFSThread; } protected: - static LLVFSThread* sVFSThread; - static BOOL sAllocdVFSThread; - U32 threadPri() { return LLVFSThread::PRIORITY_NORMAL + llmin((U32)mPriority,(U32)0xfff); } + //CP static LLVFSThread* sVFSThread; + //CP static BOOL sAllocdVFSThread; + //CP U32 threadPri() { return LLVFSThread::PRIORITY_NORMAL + llmin((U32)mPriority,(U32)0xfff); } public: static const S32 READ; @@ -77,14 +77,15 @@ public: protected: LLAssetType::EType mFileType; + BOOL mReadComplete; LLUUID mFileID; S32 mPosition; S32 mMode; - LLVFS *mVFS; - F32 mPriority; + //CP LLVFS *mVFS; + //CP F32 mPriority; S32 mBytesRead; - LLVFSThread::handle_t mHandle; + //CP LLVFSThread::handle_t mHandle; }; #endif diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 156a1c5893..1c9f3af1e6 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -499,7 +499,7 @@ void LLAppViewerWin32::disableWinErrorReporting() } } -const S32 MAX_CONSOLE_LINES = 500; +const S32 MAX_CONSOLE_LINES = 7500; // Only defined in newer SDKs than we currently use #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 4 diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index f7ded00318..3fd709b3ce 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -382,7 +382,7 @@ void update_statistics() F64Bits layer_bits = gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits(); add(LLStatViewer::LAYERS_NETWORK_DATA_RECEIVED, layer_bits); add(LLStatViewer::OBJECT_NETWORK_DATA_RECEIVED, gObjectData); - sample(LLStatViewer::PENDING_VFS_OPERATIONS, LLVFile::getVFSThread()->getPending()); + //sample(LLStatViewer::PENDING_VFS_OPERATIONS, LLVFile::getVFSThread()->getPending()); add(LLStatViewer::ASSET_UDP_DATA_RECEIVED, F64Bits(gTransferManager.getTransferBitsIn(LLTCT_ASSET))); gTransferManager.resetTransferBitsIn(LLTCT_ASSET); |