Browse Source

pstats on individual field updates

David Rose 21 years ago
parent
commit
cbf0b4ab88

+ 1 - 1
direct/src/dcparser/dcAtomicField.cxx

@@ -30,7 +30,7 @@
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 DCAtomicField::
 DCAtomicField::
-DCAtomicField(const string &name) : DCField(name) {
+DCAtomicField(const string &name, DCClass *dclass) : DCField(name, dclass) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 1
direct/src/dcparser/dcAtomicField.h

@@ -37,7 +37,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 class EXPCL_DIRECT DCAtomicField : public DCField {
 class EXPCL_DIRECT DCAtomicField : public DCField {
 public:
 public:
-  DCAtomicField(const string &name);
+  DCAtomicField(const string &name, DCClass *dclass);
   virtual ~DCAtomicField();
   virtual ~DCAtomicField();
 
 
 PUBLISHED:
 PUBLISHED:

+ 2 - 0
direct/src/dcparser/dcClass.h

@@ -134,6 +134,8 @@ private:
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
   PyObject *_class_def;
   PyObject *_class_def;
 #endif
 #endif
+
+  friend class DCField;
 };
 };
 
 
 #include "dcClass.I"
 #include "dcClass.I"

+ 44 - 2
direct/src/dcparser/dcField.cxx

@@ -18,16 +18,52 @@
 
 
 #include "dcField.h"
 #include "dcField.h"
 #include "dcPacker.h"
 #include "dcPacker.h"
+#include "dcClass.h"
 #include "hashGenerator.h"
 #include "hashGenerator.h"
 #include "dcmsgtypes.h"
 #include "dcmsgtypes.h"
 
 
+#ifdef WITHIN_PANDA
+#include "pStatTimer.h"
+#endif
+
+////////////////////////////////////////////////////////////////////
+//     Function: DCField::Constructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+DCField::
+DCField()
+#ifdef WITHIN_PANDA
+  : _field_update_pcollector("DCField")
+#endif
+{
+  _number = -1;
+  _flags = 0;
+  _has_default_value = false;
+  _default_value_stale = true;
+
+  _has_nested_fields = true;
+  _num_nested_fields = 0;
+  _pack_type = PT_field;
+
+  _has_fixed_byte_size = true;
+  _fixed_byte_size = 0;
+  _has_fixed_structure = true;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: DCField::Constructor
 //     Function: DCField::Constructor
 //       Access: Public
 //       Access: Public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 DCField::
 DCField::
-DCField(const string &name) : DCPackerInterface(name) {
+DCField(const string &name, DCClass *dclass) : 
+  DCPackerInterface(name) 
+#ifdef WITHIN_PANDA
+  ,
+  _field_update_pcollector(dclass->_class_update_pcollector, name)
+#endif
+{
   _number = -1;
   _number = -1;
   _flags = 0;
   _flags = 0;
   _has_default_value = false;
   _has_default_value = false;
@@ -479,7 +515,13 @@ receive_update(DCPacker &packer, PyObject *distobj) const {
       PyObject *func = PyObject_GetAttrString(distobj, (char *)_name.c_str());
       PyObject *func = PyObject_GetAttrString(distobj, (char *)_name.c_str());
       nassertv(func != (PyObject *)NULL);
       nassertv(func != (PyObject *)NULL);
       
       
-      PyObject *result = PyObject_CallObject(func, args);
+      PyObject *result;
+      {
+#ifdef WITHIN_PANDA
+        PStatTimer timer(((DCField *)this)->_field_update_pcollector);
+#endif
+        result = PyObject_CallObject(func, args);
+      }
       Py_XDECREF(result);
       Py_XDECREF(result);
       Py_DECREF(func);
       Py_DECREF(func);
       Py_DECREF(args);
       Py_DECREF(args);

+ 11 - 1
direct/src/dcparser/dcField.h

@@ -23,11 +23,16 @@
 #include "dcPackerInterface.h"
 #include "dcPackerInterface.h"
 #include "dcPython.h"
 #include "dcPython.h"
 
 
+#ifdef WITHIN_PANDA
+#include "pStatCollector.h"
+#endif
+
 class DCPacker;
 class DCPacker;
 class DCAtomicField;
 class DCAtomicField;
 class DCMolecularField;
 class DCMolecularField;
 class DCParameter;
 class DCParameter;
 class DCSwitch;
 class DCSwitch;
+class DCClass;
 class HashGenerator;
 class HashGenerator;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -37,7 +42,8 @@ class HashGenerator;
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 class EXPCL_DIRECT DCField : public DCPackerInterface {
 class EXPCL_DIRECT DCField : public DCPackerInterface {
 public:
 public:
-  DCField(const string &name = string());
+  DCField();
+  DCField(const string &name, DCClass *dclass);
   virtual ~DCField();
   virtual ~DCField();
 
 
 PUBLISHED:
 PUBLISHED:
@@ -127,6 +133,10 @@ private:
   int _flags;  // A bitmask union of any of the above values.
   int _flags;  // A bitmask union of any of the above values.
 
 
   string _default_value;
   string _default_value;
+
+#ifdef WITHIN_PANDA
+  PStatCollector _field_update_pcollector;
+#endif
 };
 };
 
 
 #endif
 #endif

+ 1 - 1
direct/src/dcparser/dcMolecularField.cxx

@@ -29,7 +29,7 @@
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 DCMolecularField::
 DCMolecularField::
-DCMolecularField(const string &name) : DCField(name) {
+DCMolecularField(const string &name, DCClass *dclass) : DCField(name, dclass) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 1
direct/src/dcparser/dcMolecularField.h

@@ -34,7 +34,7 @@ class DCParameter;
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 class EXPCL_DIRECT DCMolecularField : public DCField {
 class EXPCL_DIRECT DCMolecularField : public DCField {
 public:
 public:
-  DCMolecularField(const string &name);
+  DCMolecularField(const string &name, DCClass *dclass);
 
 
 PUBLISHED:
 PUBLISHED:
   virtual DCMolecularField *as_molecular_field();
   virtual DCMolecularField *as_molecular_field();

+ 2 - 2
direct/src/dcparser/dcParser.yxx

@@ -464,7 +464,7 @@ atomic_field:
         optional_name '('
         optional_name '('
 {
 {
   $$ = current_atomic;
   $$ = current_atomic;
-  current_atomic = new DCAtomicField($1);
+  current_atomic = new DCAtomicField($1, current_class);
 }
 }
         parameter_list ')'
         parameter_list ')'
 {
 {
@@ -1154,7 +1154,7 @@ no_server_flags:
 molecular_field:
 molecular_field:
         IDENTIFIER ':'
         IDENTIFIER ':'
 {
 {
-  current_molecular = new DCMolecularField($1);
+  current_molecular = new DCMolecularField($1, current_class);
 }
 }
         molecular_atom_list
         molecular_atom_list
 {
 {