]> git.cworth.org Git - apitrace/commitdiff
trim: Avoid doing any analysis past the end of the user-specified range.
authorCarl Worth <cworth@cworth.org>
Mon, 13 Aug 2012 03:41:50 +0000 (20:41 -0700)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 22 Nov 2012 08:03:02 +0000 (08:03 +0000)
This doesn't actually change any results, (the dependency analysis
already ensures that calls beyond the range won't get included).

But this is a nice optimization to prevent wasted time and memory
analyzing these calls that are really easy to reject.

cli/cli_trim.cpp
common/trace_callset.cpp
common/trace_callset.hpp

index 1d2abffa1cee24e0eda199e8a6cef66e9cfad896..3d57c7e1772fab3c17fdcd69552748076bfef14b 100644 (file)
@@ -151,6 +151,18 @@ public:
 
     /* Compute and record all the resources provided by this call. */
     void analyze(trace::Call *call) {
+        /* If there are no side effects, this call provides nothing. */
+        if (call->flags & trace::CALL_FLAG_NO_SIDE_EFFECTS) {
+            return;
+        }
+
+        /* Similarly, calls that swap buffers don't have other side effects. */
+        if (call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET &&
+            call->flags & trace::CALL_FLAG_END_FRAME) {
+            return;
+        }
+
+        /* By default, assume this call affects the state somehow. */
         resources["state"].insert(call->no);
     }
 
@@ -215,6 +227,12 @@ trim_trace(const char *filename, struct trim_options *options)
     /* In pass 1, analyze which calls are needed. */
     trace::Call *call;
     while ((call = p.parse_call())) {
+
+        /* There's no use doing any work past the last call requested
+         * by the user. */
+        if (call->no > options->calls.getLast())
+            break;
+
         /* If requested, ignore all calls not belonging to the specified thread. */
         if (options->thread != -1 && call->thread_id != options->thread)
             continue;
@@ -256,6 +274,12 @@ trim_trace(const char *filename, struct trim_options *options)
     required = analyzer.get_required();
 
     while ((call = p.parse_call())) {
+
+        /* There's no use doing any work past the last call requested
+         * by the user. */
+        if (call->no > options->calls.getLast())
+            break;
+
         if (required->find(call->no) != required->end()) {
             writer.writeCall(call);
         }
index 3c33087cbda883f11a9d8d7280bb7295ee9c8bbf..93d145fa3a2b0f881794786d3aa23e7db047fbb9 100644 (file)
@@ -224,7 +224,7 @@ public:
 };
 
 
-CallSet::CallSet(const char *string)
+CallSet::CallSet(const char *string): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max())
 {
     if (*string == '@') {
         FileCallSetParser parser(*this, &string[1]);
@@ -236,7 +236,7 @@ CallSet::CallSet(const char *string)
 }
 
 
-CallSet::CallSet(CallFlags freq) {
+CallSet::CallSet(CallFlags freq): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max()) {
     if (freq != FREQUENCY_NONE) {
         CallNo start = std::numeric_limits<CallNo>::min();
         CallNo stop = std::numeric_limits<CallNo>::max();
index b679d94867b3f095f78b574e07c4075deccafc7e..4a4a52d397c6cef90804acfb0f16b5a7c931a6cc 100644 (file)
@@ -48,6 +48,7 @@
 #define _TRACE_CALLSET_HPP_
 
 
+#include <limits>
 #include <list>
 
 #include "trace_model.hpp"
@@ -106,12 +107,15 @@ namespace trace {
     // A collection of call ranges
     class CallSet
     {
+    private:
+        CallRange limits;
+
     public:
         // TODO: use binary tree to speed up lookups
         typedef std::list< CallRange > RangeList;
         RangeList ranges;
 
-        CallSet() {}
+        CallSet(): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max()) {}
 
         CallSet(CallFlags freq);
 
@@ -128,6 +132,16 @@ namespace trace {
             if (range.start <= range.stop &&
                 range.freq != FREQUENCY_NONE) {
 
+                if (empty()) {
+                    limits.start = range.start;
+                    limits.stop = range.stop;
+                } else {
+                    if (range.start < limits.start)
+                        limits.start = range.start;
+                    if (range.stop > limits.stop)
+                        limits.stop = range.stop;
+                }
+
                 RangeList::iterator it = ranges.begin();
                 while (it != ranges.end() && it->start < range.start) {
                     ++it;
@@ -155,6 +169,14 @@ namespace trace {
         contains(const trace::Call &call) {
             return contains(call.no, call.flags);
         }
+
+        CallNo getFirst() {
+            return limits.start;
+        }
+
+        CallNo getLast() {
+            return limits.stop;
+        }
     };