summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llfasttimer.cpp54
-rw-r--r--indra/llcommon/llinitparam.h181
2 files changed, 134 insertions, 101 deletions
diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index 5baf049c03..fbffe133f1 100644
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -117,17 +117,17 @@ struct SortTimerByName
};
TimeBlock& TimeBlock::getRootTimeBlock()
-{
+ {
static TimeBlock root_timer("root", true, NULL);
return root_timer;
-}
+ }
void TimeBlock::pushLog(LLSD log)
-{
+ {
LLMutexLock lock(sLogLock);
sLogQueue.push(log);
-}
+ }
void TimeBlock::setLogLock(LLMutex* lock)
{
@@ -149,7 +149,7 @@ U64 TimeBlock::countsPerSecond()
static LLUnit<LLUnits::Hertz, U64> sCPUClockFrequency = LLProcessorInfo().getCPUFrequency();
#else
- // If we're not using RDTSC, each fast timer tick is just a performance counter tick.
+ // If we're not using RDTSC, each fasttimer tick is just a performance counter tick.
// Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency())
// since that would change displayed MHz stats for CPUs
static bool firstcall = true;
@@ -176,9 +176,9 @@ TimeBlockTreeNode& TimeBlock::getTreeNode() const
TimeBlockTreeNode* nodep = LLTrace::get_thread_recorder()->getTimeBlockTreeNode(getIndex());
llassert(nodep);
return *nodep;
-}
+ }
-// static
+//static
void TimeBlock::processTimes()
{
get_clock_count(); // good place to calculate clock frequency
@@ -191,9 +191,9 @@ void TimeBlock::processTimes()
{
TimeBlock& timer = *it;
if (&timer == &TimeBlock::getRootTimeBlock()) continue;
-
- // bootstrap tree construction by attaching to last timer to be on stack
- // when this timer was called
+
+ // bootstrap tree construction by attaching to last timer to be on stack
+ // when this timer was called
if (timer.getParent() == &TimeBlock::getRootTimeBlock())
{
TimeBlockAccumulator* accumulator = timer.getPrimaryAccumulator();
@@ -203,7 +203,7 @@ void TimeBlock::processTimes()
timer.setParent(accumulator->mLastCaller);
accumulator->mParent = accumulator->mLastCaller;
}
- // no need to push up tree on first use, flag can be set spuriously
+ // no need to push up tree on first use, flag can be set spuriously
accumulator->mMoveUpTree = false;
}
}
@@ -230,28 +230,28 @@ void TimeBlock::processTimes()
TimeBlockAccumulator* accumulator = timerp->getPrimaryAccumulator();
if (accumulator->mMoveUpTree)
- {
+ {
// since ancestors have already been visited, re-parenting won't affect tree traversal
- //step up tree, bringing our descendants with us
- LL_DEBUGS("FastTimers") << "Moving " << timerp->getName() << " from child of " << timerp->getParent()->getName() <<
- " to child of " << timerp->getParent()->getParent()->getName() << LL_ENDL;
- timerp->setParent(timerp->getParent()->getParent());
+ //step up tree, bringing our descendants with us
+ LL_DEBUGS("FastTimers") << "Moving " << timerp->getName() << " from child of " << timerp->getParent()->getName() <<
+ " to child of " << timerp->getParent()->getParent()->getName() << LL_ENDL;
+ timerp->setParent(timerp->getParent()->getParent());
accumulator->mParent = timerp->getParent();
accumulator->mMoveUpTree = false;
- // don't bubble up any ancestors until descendants are done bubbling up
+ // don't bubble up any ancestors until descendants are done bubbling up
// as ancestors may call this timer only on certain paths, so we want to resolve
// child-most block locations before their parents
- it.skipAncestors();
- }
+ it.skipAncestors();
}
}
+}
// walk up stack of active timers and accumulate current time while leaving timing structures active
BlockTimerStackRecord* stack_record = ThreadTimerStack::getInstance();
BlockTimer* cur_timer = stack_record->mActiveTimer;
TimeBlockAccumulator* accumulator = stack_record->mTimeBlock->getPrimaryAccumulator();
-
+
// root defined by parent pointing to self
while(cur_timer && cur_timer->mParentTimerData.mActiveTimer != cur_timer)
{
@@ -286,12 +286,12 @@ void TimeBlock::processTimes()
std::vector<TimeBlock*>::iterator TimeBlock::beginChildren()
-{
+ {
return getTreeNode().mChildren.begin();
-}
+ }
std::vector<TimeBlock*>::iterator TimeBlock::endChildren()
-{
+ {
return getTreeNode().mChildren.end();
}
@@ -300,7 +300,7 @@ std::vector<TimeBlock*>& TimeBlock::getChildren()
return getTreeNode().mChildren;
}
-//static
+// static
void TimeBlock::logStats()
{
// get ready for next frame
@@ -331,7 +331,7 @@ void TimeBlock::logStats()
LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
sd[timer.getName()]["Time"] = (LLSD::Real) (frame_recording.getLastRecordingPeriod().getSum(timer).value());
sd[timer.getName()]["Calls"] = (LLSD::Integer) (frame_recording.getLastRecordingPeriod().getSum(timer.callCount()));
-
+
// computing total time here because getting the root timer's getCountHistory
// doesn't work correctly on the first frame
total_time += frame_recording.getLastRecordingPeriod().getSum(timer);
@@ -383,7 +383,7 @@ void TimeBlock::dumpCurTimes()
}
}
-//static
+//static
void TimeBlock::writeLog(std::ostream& os)
{
while (!sLogQueue.empty())
@@ -437,7 +437,7 @@ void TimeBlockAccumulator::reset( const TimeBlockAccumulator* other )
mParent = other->mParent;
}
else
- {
+{
mStartTotalTimeCounter = mTotalTimeCounter;
}
}
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index 502f93cbb8..3e18287a6f 100644
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -32,6 +32,7 @@
#include <list>
#include <boost/function.hpp>
#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_enum.hpp>
#include <boost/unordered_map.hpp>
#include "llerror.h"
@@ -210,7 +211,6 @@ namespace LLInitParam
class LL_COMMON_API Parser
{
LOG_CLASS(Parser);
-
public:
typedef std::vector<std::pair<std::string, bool> > name_stack_t;
typedef std::pair<name_stack_t::iterator, name_stack_t::iterator> name_stack_range_t;
@@ -224,32 +224,81 @@ namespace LLInitParam
typedef std::map<const std::type_info*, parser_write_func_t> parser_write_func_map_t;
typedef std::map<const std::type_info*, parser_inspect_func_t> parser_inspect_func_map_t;
+ private:
+ template<typename T, bool is_enum = boost::is_enum<T>::value>
+ struct ReaderWriter
+ {
+ static bool read(T& param, Parser* parser)
+ {
+ parser_read_func_map_t::iterator found_it = parser->mParserReadFuncs->find(&typeid(T));
+ if (found_it != parser->mParserReadFuncs->end())
+ {
+ return found_it->second(*parser, (void*)&param);
+ }
+ return false;
+ }
+
+ static bool write(const T& param, Parser* parser, name_stack_t& name_stack)
+ {
+ parser_write_func_map_t::iterator found_it = parser->mParserWriteFuncs->find(&typeid(T));
+ if (found_it != parser->mParserWriteFuncs->end())
+ {
+ return found_it->second(*parser, (const void*)&param, name_stack);
+ }
+ return false;
+ }
+ };
+
+ // read enums as ints
+ template<typename T>
+ struct ReaderWriter<T, true>
+ {
+ static bool read(T& param, Parser* parser)
+ {
+ // read all enums as ints
+ parser_read_func_map_t::iterator found_it = parser->mParserReadFuncs->find(&typeid(S32));
+ if (found_it != parser->mParserReadFuncs->end())
+ {
+ S32 value;
+ if (found_it->second(*parser, (void*)&value))
+ {
+ param = (T)value;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static bool write(const T& param, Parser* parser, name_stack_t& name_stack)
+ {
+ parser_write_func_map_t::iterator found_it = parser->mParserWriteFuncs->find(&typeid(S32));
+ if (found_it != parser->mParserWriteFuncs->end())
+ {
+ return found_it->second(*parser, (const void*)&param, name_stack);
+ }
+ return false;
+ }
+ };
+
+ public:
+
Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
: mParseSilently(false),
mParserReadFuncs(&read_map),
mParserWriteFuncs(&write_map),
mParserInspectFuncs(&inspect_map)
{}
+
virtual ~Parser();
template <typename T> bool readValue(T& param)
{
- parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
- if (found_it != mParserReadFuncs->end())
- {
- return found_it->second(*this, (void*)&param);
- }
- return false;
+ return ReaderWriter<T>::read(param, this);
}
template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
{
- parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
- if (found_it != mParserWriteFuncs->end())
- {
- return found_it->second(*this, (const void*)&param, name_stack);
- }
- return false;
+ return ReaderWriter<T>::write(param, this, name_stack);
}
// dispatch inspection to registered inspection functions, for each parameter in a param block
@@ -880,30 +929,24 @@ namespace LLInitParam
// no further names in stack, attempt to parse value now
if (name_stack_range.first == name_stack_range.second)
{
- if (parser.readValue(typed_param.getValue()))
+ std::string name;
+
+ // try to parse a known named value
+ if(name_value_lookup_t::valueNamesExist()
+ && parser.readValue(name)
+ && name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.clearValueName();
+ typed_param.setValueName(name);
typed_param.setProvided();
return true;
}
-
- // try to parse a known named value
- if(name_value_lookup_t::valueNamesExist())
+ // try to read value directly
+ else if (parser.readValue(typed_param.getValue()))
{
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
- {
- typed_param.setValueName(name);
+ typed_param.clearValueName();
typed_param.setProvided();
return true;
}
-
- }
- }
}
return false;
}
@@ -1040,30 +1083,29 @@ namespace LLInitParam
static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
self_t& typed_param = static_cast<self_t&>(param);
- // attempt to parse block...
- if(typed_param.deserializeBlock(parser, name_stack_range, new_name))
+
+ if (name_stack_range.first == name_stack_range.second)
+ { // try to parse a known named value
+ std::string name;
+
+ if(name_value_lookup_t::valueNamesExist()
+ && parser.readValue(name)
+ && name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.clearValueName();
+ typed_param.setValueName(name);
typed_param.setProvided();
return true;
}
+ }
- if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
- {
- typed_param.setValueName(name);
+ if(typed_param.deserializeBlock(parser, name_stack_range, new_name))
+ { // attempt to parse block...
+ typed_param.clearValueName();
typed_param.setProvided();
return true;
}
- }
- }
+
return false;
}
@@ -1228,30 +1270,22 @@ namespace LLInitParam
// no further names in stack, attempt to parse value now
if (new_name_stack_range.first == new_name_stack_range.second)
{
- // attempt to read value directly
- if (parser.readValue(value))
+ std::string name;
+
+ // try to parse a known named value
+ if(name_value_lookup_t::valueNamesExist()
+ && parser.readValue(name)
+ && name_value_lookup_t::getValueFromName(name, value))
{
typed_param.add(value);
+ typed_param.mValues.back().setValueName(name);
return true;
}
-
- // try to parse a known named value
- if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, value))
+ else if (parser.readValue(value)) // attempt to read value directly
{
typed_param.add(value);
- typed_param.mValues.back().setValueName(name);
return true;
}
-
- }
- }
}
return false;
}
@@ -1475,9 +1509,15 @@ namespace LLInitParam
param_value_t& value = typed_param.mValues.back();
- // attempt to parse block...
- if(value.deserializeBlock(parser, new_name_stack_range, new_name))
+ if (new_name_stack_range.first == new_name_stack_range.second)
+ { // try to parse a known named value
+ std::string name;
+
+ if(name_value_lookup_t::valueNamesExist()
+ && parser.readValue(name)
+ && name_value_lookup_t::getValueFromName(name, value.getValue()))
{
+ typed_param.mValues.back().setValueName(name);
typed_param.setProvided();
if (new_array_value)
{
@@ -1485,16 +1525,11 @@ namespace LLInitParam
}
return true;
}
- else if(name_value_lookup_t::valueNamesExist())
- {
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (name_value_lookup_t::getValueFromName(name, value.getValue()))
+ }
+
+ // attempt to parse block...
+ if(value.deserializeBlock(parser, name_stack_range, new_name))
{
- typed_param.mValues.back().setValueName(name);
typed_param.setProvided();
if (new_array_value)
{
@@ -1503,8 +1538,6 @@ namespace LLInitParam
return true;
}
- }
- }
if (new_value)
{ // failed to parse new value, pop it off
@@ -1547,7 +1580,7 @@ namespace LLInitParam
}
name_stack.pop_back();
- }
+ }
if (!serialized && predicate_rule.check(ll_make_predicate(EMPTY)))
{