From cbf0b4ab886e3393dace9f805912c1d50d215265 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 22 Nov 2004 23:25:20 +0000 Subject: [PATCH] pstats on individual field updates --- direct/src/dcparser/dcAtomicField.cxx | 2 +- direct/src/dcparser/dcAtomicField.h | 2 +- direct/src/dcparser/dcClass.h | 2 ++ direct/src/dcparser/dcField.cxx | 46 ++++++++++++++++++++++-- direct/src/dcparser/dcField.h | 12 ++++++- direct/src/dcparser/dcMolecularField.cxx | 2 +- direct/src/dcparser/dcMolecularField.h | 2 +- direct/src/dcparser/dcParser.yxx | 4 +-- 8 files changed, 63 insertions(+), 9 deletions(-) diff --git a/direct/src/dcparser/dcAtomicField.cxx b/direct/src/dcparser/dcAtomicField.cxx index e1ad202f93..bff8feb489 100644 --- a/direct/src/dcparser/dcAtomicField.cxx +++ b/direct/src/dcparser/dcAtomicField.cxx @@ -30,7 +30,7 @@ // Description: //////////////////////////////////////////////////////////////////// DCAtomicField:: -DCAtomicField(const string &name) : DCField(name) { +DCAtomicField(const string &name, DCClass *dclass) : DCField(name, dclass) { } //////////////////////////////////////////////////////////////////// diff --git a/direct/src/dcparser/dcAtomicField.h b/direct/src/dcparser/dcAtomicField.h index 53f7c312d5..48d456c3a8 100644 --- a/direct/src/dcparser/dcAtomicField.h +++ b/direct/src/dcparser/dcAtomicField.h @@ -37,7 +37,7 @@ //////////////////////////////////////////////////////////////////// class EXPCL_DIRECT DCAtomicField : public DCField { public: - DCAtomicField(const string &name); + DCAtomicField(const string &name, DCClass *dclass); virtual ~DCAtomicField(); PUBLISHED: diff --git a/direct/src/dcparser/dcClass.h b/direct/src/dcparser/dcClass.h index 49a60ed0f5..180cd686d1 100644 --- a/direct/src/dcparser/dcClass.h +++ b/direct/src/dcparser/dcClass.h @@ -134,6 +134,8 @@ private: #ifdef HAVE_PYTHON PyObject *_class_def; #endif + + friend class DCField; }; #include "dcClass.I" diff --git a/direct/src/dcparser/dcField.cxx b/direct/src/dcparser/dcField.cxx index d601d01b7c..1abf258e4c 100644 --- a/direct/src/dcparser/dcField.cxx +++ b/direct/src/dcparser/dcField.cxx @@ -18,16 +18,52 @@ #include "dcField.h" #include "dcPacker.h" +#include "dcClass.h" #include "hashGenerator.h" #include "dcmsgtypes.h" +#ifdef WITHIN_PANDA +#include "pStatTimer.h" +#endif + //////////////////////////////////////////////////////////////////// // Function: DCField::Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// DCField:: -DCField(const string &name) : DCPackerInterface(name) { +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 +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +DCField:: +DCField(const string &name, DCClass *dclass) : + DCPackerInterface(name) +#ifdef WITHIN_PANDA + , + _field_update_pcollector(dclass->_class_update_pcollector, name) +#endif +{ _number = -1; _flags = 0; _has_default_value = false; @@ -479,7 +515,13 @@ receive_update(DCPacker &packer, PyObject *distobj) const { PyObject *func = PyObject_GetAttrString(distobj, (char *)_name.c_str()); 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_DECREF(func); Py_DECREF(args); diff --git a/direct/src/dcparser/dcField.h b/direct/src/dcparser/dcField.h index 1240c5330f..c85585e4ce 100644 --- a/direct/src/dcparser/dcField.h +++ b/direct/src/dcparser/dcField.h @@ -23,11 +23,16 @@ #include "dcPackerInterface.h" #include "dcPython.h" +#ifdef WITHIN_PANDA +#include "pStatCollector.h" +#endif + class DCPacker; class DCAtomicField; class DCMolecularField; class DCParameter; class DCSwitch; +class DCClass; class HashGenerator; //////////////////////////////////////////////////////////////////// @@ -37,7 +42,8 @@ class HashGenerator; //////////////////////////////////////////////////////////////////// class EXPCL_DIRECT DCField : public DCPackerInterface { public: - DCField(const string &name = string()); + DCField(); + DCField(const string &name, DCClass *dclass); virtual ~DCField(); PUBLISHED: @@ -127,6 +133,10 @@ private: int _flags; // A bitmask union of any of the above values. string _default_value; + +#ifdef WITHIN_PANDA + PStatCollector _field_update_pcollector; +#endif }; #endif diff --git a/direct/src/dcparser/dcMolecularField.cxx b/direct/src/dcparser/dcMolecularField.cxx index 48962e106b..0fd2820e23 100644 --- a/direct/src/dcparser/dcMolecularField.cxx +++ b/direct/src/dcparser/dcMolecularField.cxx @@ -29,7 +29,7 @@ // Description: //////////////////////////////////////////////////////////////////// DCMolecularField:: -DCMolecularField(const string &name) : DCField(name) { +DCMolecularField(const string &name, DCClass *dclass) : DCField(name, dclass) { } //////////////////////////////////////////////////////////////////// diff --git a/direct/src/dcparser/dcMolecularField.h b/direct/src/dcparser/dcMolecularField.h index b7d882f3f9..ec588540ba 100644 --- a/direct/src/dcparser/dcMolecularField.h +++ b/direct/src/dcparser/dcMolecularField.h @@ -34,7 +34,7 @@ class DCParameter; //////////////////////////////////////////////////////////////////// class EXPCL_DIRECT DCMolecularField : public DCField { public: - DCMolecularField(const string &name); + DCMolecularField(const string &name, DCClass *dclass); PUBLISHED: virtual DCMolecularField *as_molecular_field(); diff --git a/direct/src/dcparser/dcParser.yxx b/direct/src/dcparser/dcParser.yxx index d95b6445c3..4f891b4a03 100644 --- a/direct/src/dcparser/dcParser.yxx +++ b/direct/src/dcparser/dcParser.yxx @@ -464,7 +464,7 @@ atomic_field: optional_name '(' { $$ = current_atomic; - current_atomic = new DCAtomicField($1); + current_atomic = new DCAtomicField($1, current_class); } parameter_list ')' { @@ -1154,7 +1154,7 @@ no_server_flags: molecular_field: IDENTIFIER ':' { - current_molecular = new DCMolecularField($1); + current_molecular = new DCMolecularField($1, current_class); } molecular_atom_list {