summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCallum Prentice <callum@gmail.com>2020-09-11 10:00:17 -0700
committerCallum Prentice <callum@gmail.com>2020-09-11 10:00:17 -0700
commit8c289ec126edf510a542c86e4c9df1787a37acb6 (patch)
treedfe5c9811c0b6b4e3aa3ad21dbb17c259814adc4
parente8b31d03b4f6f0ffb981b4ea150743daf7b4a958 (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.xml6
-rw-r--r--indra/cmake/00-Common.cmake10
-rw-r--r--indra/llcommon/llerror.cpp61
-rw-r--r--indra/llvfs/llvfile.cpp751
-rw-r--r--indra/llvfs/llvfile.h19
-rw-r--r--indra/newview/llappviewerwin32.cpp2
-rw-r--r--indra/newview/llviewerstats.cpp2
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);