reduced memory usage and useless copying, maintain a queue for message items while filter is being applied and push them to the main deque after filtering finishes

This commit is contained in:
Hazim Gazov
2010-06-11 22:23:05 +00:00
parent b9ad9e1c2f
commit 10a70cb843
2 changed files with 17 additions and 6 deletions

View File

@@ -415,9 +415,7 @@ LLMessageLogFilterApply::LLMessageLogFilterApply()
mFinished(FALSE), mFinished(FALSE),
mProgress(0) mProgress(0)
{ {
//make extra sure we don't invalidate any iterators and reserve a deque exclusively for our use mIter = LLFloaterMessageLog::sMessageLogEntries.begin();
mFilterTempMessages = LLFloaterMessageLog::sMessageLogEntries;
mIter = mFilterTempMessages.begin();
} }
void LLMessageLogFilterApply::cancel() void LLMessageLogFilterApply::cancel()
{ {
@@ -425,7 +423,7 @@ void LLMessageLogFilterApply::cancel()
} }
BOOL LLMessageLogFilterApply::tick() BOOL LLMessageLogFilterApply::tick()
{ {
std::deque<LLMessageLogEntry>::iterator end = mFilterTempMessages.end(); std::deque<LLMessageLogEntry>::iterator end = LLFloaterMessageLog::sMessageLogEntries.end();
if(mIter == end || !LLFloaterMessageLog::sInstance) if(mIter == end || !LLFloaterMessageLog::sInstance)
{ {
mFinished = TRUE; mFinished = TRUE;
@@ -448,6 +446,18 @@ BOOL LLMessageLogFilterApply::tick()
if(LLFloaterMessageLog::sInstance->mMessageLogFilterApply == this) if(LLFloaterMessageLog::sInstance->mMessageLogFilterApply == this)
{ {
LLFloaterMessageLog::sInstance->stopApplyingFilter(); LLFloaterMessageLog::sInstance->stopApplyingFilter();
//we're done messing with the deque, push all queued items to the main deque
std::deque<LLMessageLogEntry>::iterator queueIter = mQueuedMessages.begin();
std::deque<LLMessageLogEntry>::iterator queueEnd = mQueuedMessages.end();
while(queueIter != queueEnd)
{
LLFloaterMessageLog::sInstance->conditionalLog(LLFloaterMessageLogItem((*queueIter)));
++queueIter;
}
mQueuedMessages.clear();
} }
} }
@@ -690,9 +700,10 @@ void LLFloaterMessageLog::setNetInfoMode(ENetInfoMode mode)
// static // static
void LLFloaterMessageLog::onLog(LLMessageLogEntry entry) void LLFloaterMessageLog::onLog(LLMessageLogEntry entry)
{ {
sMessageLogEntries.push_back(entry); //don't mess with the queue while a filter's being applied, or face invalid iterators
if(!sBusyApplyingFilter) if(!sBusyApplyingFilter)
{ {
sMessageLogEntries.push_back(entry);
conditionalLog(LLFloaterMessageLogItem(entry)); conditionalLog(LLFloaterMessageLogItem(entry));
} }
} }

View File

@@ -46,7 +46,7 @@ public:
S32 mProgress; S32 mProgress;
BOOL mFinished; BOOL mFinished;
private: private:
std::deque<LLMessageLogEntry> mFilterTempMessages; std::deque<LLMessageLogEntry> mQueuedMessages;
std::deque<LLMessageLogEntry>::iterator mIter; std::deque<LLMessageLogEntry>::iterator mIter;
}; };
class LLFloaterMessageLog : public LLFloater, public LLEventTimer class LLFloaterMessageLog : public LLFloater, public LLEventTimer