Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e182063
#5358 Improve performance when processing inventory fetches in parallel
akleshchev Feb 3, 2026
dda37e5
#5377 Fix PBR being highlighted incorrectly on a face
akleshchev Feb 6, 2026
ee3242a
#5380 Fix crash in LLImageGL::analyzeAlpha()
marchcat Feb 6, 2026
30f0b8c
#5380 Fix race condition in texture creation causing AV
marchcat Feb 6, 2026
a06a6f0
#5380 Guard against scaled() failure to prevent null dereference
marchcat Feb 6, 2026
a35c315
#5376 fix snapshot size not being updated when clicking 'Save to disk'
maxim-productengine Feb 10, 2026
5959bd3
#5398 Add keyboard shortcuts for "Use shared environment" and "Midday…
maxim-productengine Feb 10, 2026
58c405c
#5356 Parse large messages on a general thread instead of main one
akleshchev Feb 10, 2026
6be26a0
#5356 Fix fast texture cache's mutex stall
akleshchev Feb 10, 2026
7e9cc1a
FIX - prejump bug
trish-sl Feb 11, 2026
e83f6a2
#5405 Stalls on LLFileSystem::getExists
akleshchev Feb 11, 2026
2cabd41
fix - copilot suggestions
trish-sl Feb 11, 2026
deec7b6
#5404 Allow adding to favorites directly from the avatar
akleshchev Feb 11, 2026
77f534e
Update comment in indra/newview/llagent.h
marchcat Feb 11, 2026
2a9c198
fix - threshold as debug setting & comment & flag label
trish-sl Feb 11, 2026
56d323a
Merge pull request #5409 from trish-sl/fix-prejump-controlflags
marchcat Feb 11, 2026
5386d14
#5409 Post-merge fix: variable name mismatch
marchcat Feb 11, 2026
b404990
#5414 Don't crash on unknown layer type
akleshchev Feb 12, 2026
8c70eb5
#1807 Fix navigation bar's search filters
akleshchev Feb 13, 2026
83b397b
#5395 Draw yellow friend dots last on the mini-map
maxim-productengine Feb 13, 2026
b9fd205
#5356 Fix fast texture cache's mutex stall #2
akleshchev Feb 11, 2026
44c6630
#5419 remove old unused floater
maxim-productengine Feb 16, 2026
b3ea509
#2938 show confirmation before closing Conference chat
maxim-productengine Feb 17, 2026
3973ba1
#5397 Add a setting to see own group tag without seeing others
maxim-productengine Feb 18, 2026
a52066c
#5396 Add an option to hide Recent, Worn and Favorites tabs
maxim-productengine Feb 20, 2026
90ae824
#5435 Update viewer indra_constants.h
maxim-productengine Feb 23, 2026
9fae099
#5443 fix crash in LLPreviewNotecard::canClose
maxim-productengine Feb 23, 2026
ce21568
#5431 Fix GLTF rotation corruption on upload
marchcat Feb 24, 2026
6cd2a02
#5449 Fix GLB textures loading regression
marchcat Feb 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions indra/llaudio/llaudioengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ void LLAudioEngine::updateChannels()

void LLAudioEngine::idle()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA;
// "Update" all of our audio sources, clean up dead ones.
// Primarily does position updating, cleanup of unused audio sources.
// Also does regeneration of the current priority of each audio source.
Expand Down
22 changes: 22 additions & 0 deletions indra/llcommon/indra_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,28 @@ constexpr U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
constexpr U8 SIM_ACCESS_DOWN = 254;
constexpr U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT;

// map item types
constexpr U32 MAP_ITEM_TELEHUB = 0x01;
constexpr U32 MAP_ITEM_PG_EVENT = 0x02;
constexpr U32 MAP_ITEM_MATURE_EVENT = 0x03;
// constexpr U32 MAP_ITEM_POPULAR = 0x04; // No longer supported, 2009-03-02 KLW
// constexpr U32 MAP_ITEM_AGENT_COUNT = 0x05;
constexpr U32 MAP_ITEM_AGENT_LOCATIONS = 0x06;
constexpr U32 MAP_ITEM_LAND_FOR_SALE = 0x07;
constexpr U32 MAP_ITEM_CLASSIFIED = 0x08;
constexpr U32 MAP_ITEM_ADULT_EVENT = 0x09;
constexpr U32 MAP_ITEM_LAND_FOR_SALE_ADULT = 0x0a;

// Region map layer numbers
constexpr S32 MAP_SIM_OBJECTS = 0;
constexpr S32 MAP_SIM_TERRAIN = 1;
constexpr S32 MAP_SIM_LAND_FOR_SALE = 2; // Transparent alpha overlay of land for sale
constexpr S32 MAP_SIM_IMAGE_TYPES = 3; // Number of map layers
constexpr S32 MAP_SIM_INFO_MASK = 0x00FFFFFF; // Agent access may be stuffed into upper byte
constexpr S32 MAP_SIM_LAYER_MASK = 0x0000FFFF; // Layer info is in lower 16 bits
constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
constexpr S32 MAP_SIM_PRELUDE = 0x00020000;

// attachment constants
constexpr U8 ATTACHMENT_ADD = 0x80;

Expand Down
18 changes: 7 additions & 11 deletions indra/llfilesystem/llfilesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,10 @@ bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType fil
LL_PROFILE_ZONE_SCOPED;
const std::string filename = LLDiskCache::metaDataToFilepath(file_id, file_type);

llifstream file(filename, std::ios::binary);
if (file.is_open())
boost::system::error_code ec;
if (boost::filesystem::exists(filename, ec) && boost::filesystem::is_regular_file(filename, ec))
{
file.seekg(0, std::ios::end);
return file.tellg() > 0;
return boost::filesystem::file_size(filename, ec) > 0;
}
return false;
}
Expand Down Expand Up @@ -120,15 +119,12 @@ S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType fi
{
const std::string filename = LLDiskCache::metaDataToFilepath(file_id, file_type);

S32 file_size = 0;
llifstream file(filename, std::ios::binary);
if (file.is_open())
boost::system::error_code ec;
if (boost::filesystem::exists(filename, ec) && boost::filesystem::is_regular_file(filename, ec))
{
file.seekg(0, std::ios::end);
file_size = (S32)file.tellg();
return static_cast<S32>(boost::filesystem::file_size(filename, ec));
}

return file_size;
return 0;
}

bool LLFileSystem::read(U8* buffer, S32 bytes)
Expand Down
132 changes: 95 additions & 37 deletions indra/llmessage/llcorehttputil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "llsdserialize.h"
#include "boost/json.hpp" // Boost.Json
#include "llfilesystem.h"
#include "workqueue.h"

#include "message.h" // for getting the port

Expand Down Expand Up @@ -295,41 +296,73 @@ void HttpCoroHandler::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespons
}
else
{
try
constexpr size_t MAX_BODY_SIZE_THRESHOLD = 65536;
bool posted = false;
// Some messsages (ex: AISAPI) can return large bodies.
// If the body is larger than our threshold, post the
// parsing to the general queue to avoid stalling the
// main thread.
if (response->getBodySize() > MAX_BODY_SIZE_THRESHOLD)
{
result = this->handleSuccess(response, status);
}
catch (std::bad_alloc&)
{
LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling." << LL_ENDL;
}
}
response->addRef();

buildStatusEntry(response, status, result);
LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General");
posted = main_queue->postTo(
general_queue,
[handler = shared_from_this(), response, status]() // Work done on general queue
{
std::pair<LLSD, LLCore::HttpStatus> result;
result.second = status;
try
{
result.first = handler->handleSuccess(response, result.second);
}
catch (std::bad_alloc&)
{
LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling (threaded)." << LL_ENDL;
}
// LLSD is not thread safe! Be carefull with moving the result around.
return result;
},
[handler = shared_from_this(), response](std::pair<LLSD, LLCore::HttpStatus> result) mutable // Callback to main thread
{
handler->replyPost(response, result.second, result.first);
response->release();
});

if (!status)
{
LLSD &httpStatus = result[HttpCoroutineAdapter::HTTP_RESULTS];
if (posted)
{
// Thread will do the cleanup and notify the pump. Done.
return;
}
else
{
// For whatever reason, failed to post, clean up and
// do the work on the main thread.
response->release();
}
}

LLCore::BufferArray *body = response->getBody();
LLCore::BufferArrayStream bas(body);
LLSD::String bodyData;
bodyData.reserve(response->getBodySize());
bas >> std::noskipws;
bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>());
httpStatus["error_body"] = LLSD(bodyData);
if (getBoolSetting(HTTP_LOGBODY_KEY))
if (!posted)
{
// commenting out, but keeping since this can be useful for debugging
LL_WARNS("CoreHTTP") << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
try
{
result = this->handleSuccess(response, status);
}
catch (std::bad_alloc&)
{
LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling." << LL_ENDL;
}
}
}

mReplyPump.post(result);
replyPost(response, status, result);
}

void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result)
void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result) const
{
LLSD httpresults = LLSD::emptyMap();

Expand Down Expand Up @@ -357,6 +390,31 @@ void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::H
result[HttpCoroutineAdapter::HTTP_RESULTS] = httpresults;
}

void HttpCoroHandler::replyPost(LLCore::HttpResponse* response, LLCore::HttpStatus &status, LLSD& result)
{
buildStatusEntry(response, status, result);

if (!status)
{
LLSD& httpStatus = result[HttpCoroutineAdapter::HTTP_RESULTS];

LLCore::BufferArray* body = response->getBody();
LLCore::BufferArrayStream bas(body);
LLSD::String bodyData;
bodyData.reserve(response->getBodySize());
bas >> std::noskipws;
bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>());
httpStatus["error_body"] = LLSD(bodyData);
if (getBoolSetting(HTTP_LOGBODY_KEY))
{
// commenting out, but keeping since this can be useful for debugging
LL_WARNS("CoreHTTP") << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
}
}

mReplyPump.post(result);
}

void HttpCoroHandler::writeStatusCodes(LLCore::HttpStatus status, const std::string &url, LLSD &result)
{
result[HttpCoroutineAdapter::HTTP_RESULTS_SUCCESS] = static_cast<LLSD::Boolean>(status);
Expand Down Expand Up @@ -389,8 +447,8 @@ class HttpCoroLLSDHandler : public HttpCoroHandler
HttpCoroLLSDHandler(LLEventStream &reply);

protected:
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status);
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success);
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const;
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const;
};

//-------------------------------------------------------------------------
Expand All @@ -400,7 +458,7 @@ HttpCoroLLSDHandler::HttpCoroLLSDHandler(LLEventStream &reply):
}


LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status)
LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const
{
LLSD result;

Expand Down Expand Up @@ -465,7 +523,7 @@ LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore:
return result;
}

LLSD HttpCoroLLSDHandler::parseBody(LLCore::HttpResponse *response, bool &success)
LLSD HttpCoroLLSDHandler::parseBody(LLCore::HttpResponse *response, bool &success) const
{
success = true;
if (response->getBodySize() == 0)
Expand Down Expand Up @@ -496,8 +554,8 @@ class HttpCoroRawHandler : public HttpCoroHandler
public:
HttpCoroRawHandler(LLEventStream &reply);

virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status);
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success);
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const;
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const;
};

//-------------------------------------------------------------------------
Expand All @@ -506,7 +564,7 @@ HttpCoroRawHandler::HttpCoroRawHandler(LLEventStream &reply):
{
}

LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status)
LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const
{
LLSD result = LLSD::emptyMap();

Expand Down Expand Up @@ -552,7 +610,7 @@ LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::
return result;
}

LLSD HttpCoroRawHandler::parseBody(LLCore::HttpResponse *response, bool &success)
LLSD HttpCoroRawHandler::parseBody(LLCore::HttpResponse *response, bool &success) const
{
success = true;
return LLSD();
Expand All @@ -571,8 +629,8 @@ class HttpCoroJSONHandler : public HttpCoroHandler
public:
HttpCoroJSONHandler(LLEventStream &reply);

virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status);
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success);
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const;
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const;
};

//-------------------------------------------------------------------------
Expand All @@ -581,7 +639,7 @@ HttpCoroJSONHandler::HttpCoroJSONHandler(LLEventStream &reply) :
{
}

LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status)
LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const
{
LLSD result = LLSD::emptyMap();

Expand All @@ -607,7 +665,7 @@ LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore:
return result;
}

LLSD HttpCoroJSONHandler::parseBody(LLCore::HttpResponse *response, bool &success)
LLSD HttpCoroJSONHandler::parseBody(LLCore::HttpResponse *response, bool &success) const
{
success = true;
BufferArray * body(response->getBody());
Expand Down
9 changes: 5 additions & 4 deletions indra/llmessage/llcorehttputil.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ inline LLCore::HttpHandle requestPatchWithLLSD(LLCore::HttpRequest::ptr_t & requ
/// +- ["url"] - The URL used to make the call.
/// +- ["headers"] - A map of name name value pairs with the HTTP headers.
///
class HttpCoroHandler : public LLCore::HttpHandler
class HttpCoroHandler : public LLCore::HttpHandler, public std::enable_shared_from_this<HttpCoroHandler>
{
public:

Expand All @@ -279,11 +279,12 @@ class HttpCoroHandler : public LLCore::HttpHandler

protected:
/// this method may modify the status value
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) = 0;
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) = 0;
virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const = 0;
virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const = 0;

private:
void buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result);
void buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result) const;
void replyPost(LLCore::HttpResponse* response, LLCore::HttpStatus& status, LLSD& result);

LLEventStream &mReplyPump;
};
Expand Down
2 changes: 1 addition & 1 deletion indra/llrender/llimagegl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2189,7 +2189,7 @@ void LLImageGL::calcAlphaChannelOffsetAndStride()

void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
{
if(sSkipAnalyzeAlpha || !mNeedsAlphaAndPickMask)
if(!data_in || sSkipAnalyzeAlpha || !mNeedsAlphaAndPickMask)
{
return ;
}
Expand Down
13 changes: 13 additions & 0 deletions indra/llui/lltabcontainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2202,3 +2202,16 @@ void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible )

updateMaxScrollPos();
}

bool LLTabContainer::getTabVisibility(const LLPanel* panel) const
{
for (tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr)
{
LLTabTuple const* pTT = *itr;
if (pTT->mTabPanel == panel)
{
return pTT->mVisible;
}
}
return false;
}
1 change: 1 addition & 0 deletions indra/llui/lltabcontainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ class LLTabContainer : public LLPanel
S32 getMaxTabWidth() const { return mMaxTabWidth; }

void setTabVisibility( LLPanel const *aPanel, bool );
bool getTabVisibility(const LLPanel* panel) const;

void startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); }

Expand Down
Loading
Loading