[Ns-developers] NS-3 PyBindGen again

Gustavo Carneiro gjcarneiro at gmail.com
Mon Jan 7 04:42:40 PST 2008


On 07/01/2008, Mathieu Lacage <mathieu.lacage at sophia.inria.fr> wrote:
>
> On Mon, 2008-01-07 at 11:29 +0000, Gustavo Carneiro wrote:
>
> [snip]
>
> > I won't comment on you specific implementation, but I have to question
> > whether this is really useful or not.  How often do you connect
> > callbacks from Python to C++ functions?
>
> Quite often if you want to connect a C++ statistics class to a trace
> hook.


Well, let's worry about that case when we have that C++ statistics class,
shall we? :-)

I don't have time to tackle all the problems at once...

[snip]
>
> >         Do you have an idea on how this could be implemented ? If so,
> >         could you
> >         outline briefly how you think it could be done ?
> >
> > This is where we have to provide a MakeCallback API to Python, the
> > types mangled into the name. Example:
> >
> > In C++:
> >
> > static void
> > CourseChange (const TraceContext &context, Ptr<const MobilityModel>
> > position)
> > {
> > [...]
> > }
> >
> > [...]
> >       notifier->TraceConnect ("/course-change", MakeCallback
> > (&CourseChange));
> > [...]
> >
> > In Python would be:
> >
> >
> > def CourseChange (context, position):
> >     [...]
> >
> > [...]
> >       notifier.TraceConnect("/course-change",
> >
> MakeCallback__lt__const_TraceContext_amp_Ptr__lt__const_MobilityModel__gt____gt__(CourseChange));
> >
> > Yes, it's very ugly.  But I don't see any way around it with the
> > current API.
> >
> > It would be nice, though, if the API could be enhanced to provide
> > introspection of the required tracing callbacks.  An API like this
> > would be enough:
> >
> > const std::type_info GetTraceCallbackType(const std::string path)
> > const;
> >
> > Should I open a bug report?
>
> This API is, however, impossible to implement in C++ as far as I know :/


What about this patch?  I don't know how to integrate this "upstream", but
this code compiles which appears to indicate it can be done.  I mean, it can
be done by someone that actually understands the web of class composition
that is the tracing subsystem, which is not my case :P

diff -r 87ff0046ed2c src/core/callback-trace-source.h
--- a/src/core/callback-trace-source.h    Sun Jan 06 23:23:46 2008 +0000
+++ b/src/core/callback-trace-source.h    Mon Jan 07 12:32:54 2008 +0000
@@ -23,6 +23,7 @@
 #define CALLBACK_TRACE_H

 #include <list>
+#include <typeinfo>
 #include "callback.h"
 #include "fatal-error.h"
 #include "trace-context.h"
@@ -41,10 +42,16 @@ template<typename T1 = empty, typename T
          typename T3 = empty, typename T4 = empty>
 class CallbackTraceSource : public TraceSource {
 public:
+
+  typedef Callback<void,TraceContext const &,T1,T2,T3,T4> CallbackType;
+
   CallbackTraceSource ();
   virtual void AddCallback (CallbackBase const & callback, TraceContext
const & context);
   virtual void RemoveCallback (CallbackBase const & callback);
   virtual void ConnectPrinter (std::ostream &os, const TraceContext
&context);
+  virtual const std::type_info& GetCallbackType () const {
+    return typeid (CallbackType);
+  }
   void operator() (void) const;
   void operator() (T1 a1) const;
   void operator() (T1 a1, T2 a2) const;
@@ -52,7 +59,7 @@ public:
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4) const;

 private:
-  typedef std::list<Callback<void,TraceContext const &,T1,T2,T3,T4> >
CallbackList;
+  typedef std::list<CallbackType> CallbackList;
   TraceContext m_context;
   CallbackList m_callbackList;
 };

What we could potentially do is add some API which reports the set of
> TraceDoc objects which match a specific trace path so, from python, you
> could get these before calling Connect and attempt to create the right
> kind of callback by using a callback name mangled by the signature
> requested.


 I think my solution is simpler for me.  If it can be made to work, that is.

If the above could be made to work, the final problem you would need to
> be able to solve would be how to bind the TraceContext class. i.e.,
> could you make it possible for the python trace hook to read the context
> of the TraceContext ?


I think so, but it won't be pretty :P

This API (template <typename T> bool GetElement (T &context) const) is based
on templated methods.  I need to generate all method template
instantiations, but then the method names have to be mangled with the type
names.  Again, adding dynamic introspection features to the C++ API would be
most welcome for Python bindings, else user will have to call methods with
mangled names.

-- 
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert


More information about the Ns-developers mailing list