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:
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user