X-Git-Url: https://git.cworth.org/git?p=apitrace;a=blobdiff_plain;f=common%2Ftrace_callset.hpp;h=35729c4cc0f66d81a1534048d5d2f0d00bc5354f;hp=a2f82134c558972eca41c090d660f4470a8105f1;hb=570d8ccab67e230f61f9c79e4eaa6a1159bb6428;hpb=ec8f5a61f393e75e4c3e3e22f84c773af66810e9 diff --git a/common/trace_callset.hpp b/common/trace_callset.hpp index a2f8213..35729c4 100644 --- a/common/trace_callset.hpp +++ b/common/trace_callset.hpp @@ -52,7 +52,7 @@ #include #include "trace_model.hpp" - +#include "trace_fast_callset.hpp" namespace trace { @@ -106,7 +106,11 @@ namespace trace { CallRange limits; public: - // TODO: use binary tree to speed up lookups + FastCallSet fast_call_set; + + // TODO: use binary tree to speed up lookups, (less important + // now that we are using FastCallSet for ranges without step + // or freq). typedef std::list< CallRange > RangeList; RangeList ranges; @@ -119,7 +123,7 @@ namespace trace { // Not empty set inline bool empty() const { - return ranges.empty(); + return fast_call_set.empty() && ranges.empty(); } void @@ -137,12 +141,17 @@ namespace trace { limits.stop = range.stop; } - RangeList::iterator it = ranges.begin(); - while (it != ranges.end() && it->start < range.start) { - ++it; - } + /* Optimize by using fast_call_set whenever possible */ + if (range.step == 1 && range.freq == FREQUENCY_ALL) { + fast_call_set.add(range.start, range.stop); + } else { + RangeList::iterator it = ranges.begin(); + while (it != ranges.end() && it->start < range.start) { + ++it; + } - ranges.insert(it, range); + ranges.insert(it, range); + } } } @@ -151,6 +160,8 @@ namespace trace { if (empty()) { return false; } + if (fast_call_set.contains(callNo)) + return true; RangeList::const_iterator it; for (it = ranges.begin(); it != ranges.end() && it->start <= callNo; ++it) { if (it->contains(callNo, callFlags)) {