]> git.cworth.org Git - apitrace/commitdiff
More efficient call representation.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 26 Nov 2010 15:01:29 +0000 (15:01 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 26 Nov 2010 15:01:29 +0000 (15:01 +0000)
glretrace.py
retrace.py
stdapi.py
trace.py
trace_model.cpp
trace_model.hpp
trace_parser.hpp
trace_write.cpp
trace_write.hpp

index 549a14e0fe0d63017429179111a54575381d4a51..29ba78f8cda799be06416cf79d529a4d3d4a44e7 100644 (file)
@@ -101,13 +101,13 @@ static void display(void) {
    Trace::Call *call;
 
    while ((call = parser.parse_call())) {
-      if (call->name == "glFlush") {
+      if (call->name() == "glFlush") {
          glFlush();
          return;
       }
       
-      if (call->name == "glXSwapBuffers" ||
-          call->name == "wglSwapBuffers") {
+      if (call->name() == "glXSwapBuffers" ||
+          call->name() == "wglSwapBuffers") {
          if (double_buffer)
             glutSwapBuffers();
          else
@@ -117,11 +117,11 @@ static void display(void) {
       
       retrace_call(*call);
 
-      if (call->name == "glBegin") {
+      if (call->name() == "glBegin") {
          insideGlBeginEnd = true;
       }
       
-      if (call->name == "glEnd") {
+      if (call->name() == "glEnd") {
          insideGlBeginEnd = false;
       }
 
index 0c148551da8da2084c40512b954e07c4eda95ddd..53cc6a028af4962f57431c2cc9737a09f9019fc6 100644 (file)
@@ -222,7 +222,7 @@ class Retracer:
         print 'static bool retrace_call(Trace::Call &call) {'
         for function in functions:
             if not function.sideeffects:
-                print '    if (call.name == "%s") {' % function.name
+                print '    if (call.name() == "%s") {' % function.name
                 print '        return true;'
                 print '    }'
         print
@@ -233,11 +233,11 @@ class Retracer:
         print
         for function in functions:
             if function.sideeffects:
-                print '    if (call.name == "%s") {' % function.name
+                print '    if (call.name() == "%s") {' % function.name
                 print '        retrace_%s(call);' % function.name
                 print '        return true;'
                 print '    }'
-        print '    std::cerr << "warning: unknown call " << call.name << "\\n";'
+        print '    std::cerr << "warning: unknown call " << call.name() << "\\n";'
         print '    return false;'
         print '}'
         print
@@ -286,20 +286,20 @@ static void display(void) {
    Trace::Call *call;
 
    while ((call = parser.parse_call())) {
-      if (call->name == "glFlush" ||
-          call->name == "glXSwapBuffers" ||
-          call->name == "wglSwapBuffers") {
+      if (call->name() == "glFlush" ||
+          call->name() == "glXSwapBuffers" ||
+          call->name() == "wglSwapBuffers") {
          glFlush();
          return;
       }
       
       retrace_call(*call);
 
-      if (call->name == "glBegin") {
+      if (call->name() == "glBegin") {
          insideGlBeginEnd = true;
       }
       
-      if (call->name == "glEnd") {
+      if (call->name() == "glEnd") {
          insideGlBeginEnd = false;
       }
 
index 68a837c61f32161a3e685385c3f1f36b08da30e6..c22d88ff8cb4d5049cfb6f8b9460954f8c010caa 100644 (file)
--- a/stdapi.py
+++ b/stdapi.py
@@ -341,7 +341,12 @@ class Arg:
 
 class Function:
 
+    __id = 0
+
     def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, hidden=False):
+        self.id = Function.__id
+        Function.__id += 1
+
         self.type = type
         self.name = name
 
@@ -562,3 +567,11 @@ Double = Literal("double", "Float")
 SizeT = Literal("size_t", "UInt")
 WString = Literal("wchar_t *", "WString")
 
+Int8 = Literal("int8_t", "SInt")
+UInt8 = Literal("uint8_t", "UInt")
+Int16 = Literal("int16_t", "SInt")
+UInt16 = Literal("uint16_t", "UInt")
+Int32 = Literal("int32_t", "SInt")
+UInt32 = Literal("uint32_t", "UInt")
+Int64 = Literal("int64_t", "SInt")
+UInt64 = Literal("uint64_t", "UInt")
index 95e84b5e732cc8cbd676e36fe9de35b43efd7939..da7f9ce5f9dedc5ccb8cd11f64e21146049c1cce 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -283,6 +283,16 @@ class Tracer:
         print 'typedef ' + function.prototype('* %s' % ptype) + ';'
         print 'static %s %s = NULL;' % (ptype, pvalue)
         print
+        print 'static const char * __%s_args[] = {' % (function.name)
+        for arg in function.args:
+            print '   "%s",' % (arg.name,)
+        print '};'
+        print
+        print 'static const Trace::FunctionSig __%s_sig = {' % (function.name)
+        print '   %u, "%s", %u, __%s_args' % (int(function.id), function.name, len(function.args), function.name)
+        print '};'
+        print
+
 
     def trace_function_fail(self, function):
         if function.fail is not None:
@@ -316,7 +326,7 @@ class Tracer:
             print '    %s __result;' % function.type
             result = '__result = '
         self._get_true_pointer(function)
-        print '    unsigned __call = Trace::BeginEnter("%s");' % (function.name)
+        print '    unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name)
         for arg in function.args:
             if not arg.output:
                 self.unwrap_arg(function, arg)
@@ -338,7 +348,7 @@ class Tracer:
         print
 
     def dump_arg(self, function, arg):
-        print '    Trace::BeginArg(%u, "%s");' % (arg.index, arg.name,)
+        print '    Trace::BeginArg(%u);' % (arg.index,)
         dump_instance(arg.type, arg.name)
         print '    Trace::EndArg();'
 
@@ -400,7 +410,7 @@ class Tracer:
             print '    %s __result;' % method.type
             result = '__result = '
         print '    Trace::BeginCall("%s");' % (interface.name + '::' + method.name)
-        print '    Trace::BeginArg(0, "this");'
+        print '    Trace::BeginArg(0);'
         print '    Trace::LiteralOpaque((const void *)m_pInstance);'
         print '    Trace::EndArg();'
         for arg in method.args:
index e6ec467ad10bd3cbae8eaeaae030f41ba2b3f982..b0e51582bd37b85c766bcccf988d7071fe306a4a 100644 (file)
@@ -179,10 +179,10 @@ public:
 
    void visit(Call *call) {
       const char *sep = "";
-      os << bold << call->name << normal << "(";
-      for (std::vector<Arg>::iterator it = call->args.begin(); it != call->args.end(); ++it) {
-         os << sep << italic << it->first << normal << " = ";
-         _visit(it->second);
+      os << bold << call->sig->name << normal << "(";
+      for (unsigned i = 0; i < call->args.size(); ++i) {
+         os << sep << italic << call->sig->arg_names[i] << normal << " = ";
+         _visit(call->args[i]);
          sep = ", ";
       }
       os << ")";
index 0bcd1804be03791df0ffbbfa4fb4d76074ad6d2f..9e2ae97ae7b73334278df8b767c1e4c7c3cd702e 100644 (file)
@@ -246,20 +246,27 @@ unsigned long long asUInt(const Value &node);
 double asFloat(const Value &node);
 
 
-typedef std::pair<std::string, Value *> Arg;
-
 class Call
 {
 public:
+   struct Signature {
+      std::string name;
+      std::vector<std::string> arg_names;
+   };
+
    unsigned no;
-   std::string name;
-   std::vector<Arg> args;
+   const Signature *sig;
+   std::vector<Value *> args;
    Value *ret;
 
-   Call() : ret(0) { }
+   Call(Signature *_sig) : sig(_sig), ret(0) { }
+
+   inline const std::string name(void) const {
+       return sig->name;
+   }
 
    inline Value & arg(unsigned index) {
-       return *(args[index].second);
+       return *(args[index]);
    }
 };
 
index b77fc3ec68853709dc42cdcdacacee9919f79205..5d5131563dea55f62c35e679558021a5f915a4fc 100644 (file)
@@ -56,6 +56,9 @@ protected:
    typedef std::map<unsigned, Call *> callmap;
    callmap calls;
 
+   typedef std::map<size_t, Call::Signature *> FunctionMap;
+   FunctionMap functions;
+
    typedef std::map<size_t, Bitmask::Signature *> BitmaskMap;
    BitmaskMap bitmasks;
 
@@ -118,9 +121,26 @@ public:
    }
    
    void parse_enter(void) {
-      Call *call = new Call;
+      size_t id = read_uint();
+
+      Call::Signature *sig;
+      FunctionMap::const_iterator it = functions.find(id);
+      if (it == functions.end()) {
+          sig = new Call::Signature;
+          sig->name = read_string();
+          unsigned size = read_uint();
+          for (unsigned i = 0; i < size; ++i) {
+              sig->arg_names.push_back(read_string());
+          }
+          functions[id] = sig;
+      } else {
+          sig = it->second;
+      }
+      assert(sig);
+
+      Call *call = new Call(sig);
       call->no = next_call_no++;
-      call->name = read_name();
+
       parse_call_details(call);
       calls[call->no] = call;
    }
@@ -160,12 +180,11 @@ public:
    
    void parse_arg(Call *call) {
       unsigned index = read_uint();
-      std::string name = read_name();
       Value *value = parse_value();
       if (index >= call->args.size()) {
           call->args.resize(index + 1);
       }
-      call->args[index] = Arg(name, value);
+      call->args[index] = value;
    }
    
    Value *parse_value(void) {
index 912824e012d936db5ef8bc0b478771c7608788d0..3860e319e6de795aeebe63f7ca7ce1db3df9ed20 100644 (file)
@@ -170,11 +170,23 @@ void Close(void) {
 
 static unsigned call_no = 0;
 
-unsigned BeginEnter(const char *function) {
+static std::map<Id, bool> functions;
+static std::map<Id, bool> bitmasks;
+
+
+unsigned BeginEnter(const FunctionSig &function) {
    OS::AcquireMutex();
    Open();
    WriteByte(Trace::EVENT_ENTER);
-   WriteName(function);
+   WriteUInt(function.id);
+   if (!functions[function.id]) {
+      WriteString(function.name);
+      WriteUInt(function.num_args);
+      for (unsigned i = 0; i < function.num_args; ++i) {
+         WriteString(function.args[i]);
+      }
+      functions[function.id] = true;
+   }
    return call_no++;
 }
 
@@ -196,10 +208,9 @@ void EndLeave(void) {
    OS::ReleaseMutex();
 }
 
-void BeginArg(unsigned index, const char *name) {
+void BeginArg(unsigned index) {
    WriteByte(Trace::CALL_ARG);
    WriteUInt(index);
-   WriteName(name);
 }
 
 void BeginReturn(void) {
@@ -303,8 +314,6 @@ void LiteralNamedConstant(const char *name, long long value) {
    LiteralSInt(value);
 }
 
-static std::map<Id, bool> bitmasks;
-
 void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value) {
    WriteByte(Trace::TYPE_BITMASK);
    WriteUInt(bitmask.id);
index faa36a5eef44c61698c262b11a558caefab284ff..9f9acdba14ab368825822e2ac91695a9eae7366c 100644 (file)
@@ -30,6 +30,13 @@ namespace Trace {
 
     typedef unsigned Id;
 
+    struct FunctionSig {
+        Id id;
+        const char *name;
+        unsigned num_args;
+        const char **args;
+    };
+
     struct BitmaskVal {
         const char *name;
         unsigned long long value;
@@ -44,13 +51,13 @@ namespace Trace {
     void Open(void);
     void Close(void);
     
-    unsigned BeginEnter(const char *function);
+    unsigned BeginEnter(const FunctionSig &function);
     void EndEnter(void);
     
     void BeginLeave(unsigned call);
     void EndLeave(void);
     
-    void BeginArg(unsigned index, const char *name);
+    void BeginArg(unsigned index);
     inline void EndArg(void) {}
 
     void BeginReturn(void);