[Stackless] Python, C, context-switching
Joel Vennin
joel.vennin at free.fr
Tue Sep 28 17:16:21 CEST 2004
Hello Python community,
i've got complex problem with python, c++
library and context-switching.
I introduce the problem:
I've a C/C++ library which is an event driven simulator. My C/C++
simulator use context-switching to simulate concurrency. It's using
user-thread mechanism. My simulator use some object as Element that
contains methods. This methods are called during the simulation.
I've made wrapper of my simulator with swig. So now i've a PyElement
class which is a wrapper of my Element C++ class.
I'm now able to create a scenario using python script:
example:
class Car (PyElement):
def __init__ (self):
PyElement.__init__ (self)
self.registerCallback (self.stop)
def stop (self):
while 1:
print "before stop"
self.nextEvent ()
print "after stop"
This is a simple example: I create an PyElement that register a
Python callback inside my C++ simulator. So when i instanciate a
Python Car element, my C++ simulator are aware of the creation of an
object Element, which has a python callback method.
I've tested all basics(instanciate python class, callback mechanism
with C++/python, etc) functionalities and all works fine.
The problem arrives when i'm using the context switching mechanism of
my simulator. How does it works ?
When the simulator starts, it create a context-switching for each
registered callback. And it switch the context to the first registered
callback to execute it. During the execution of the callback it can
have a nextEvent call. The nextEvent call function change the current
context to the next context and execute the callback associated to the
new context. You can see each callback function like a thread with a
wait method (here, it's called nextEvent).
When all my system is design in C++, all work fine. But when i'm
using python, the first switching context make a python segfault.
It's the trace when my python callback is called by my simulator just after a
context switching.
#0 0x0810202c in PyFrame_New (tstate=0x0, code=0x402ea7a0,
globals=0x402aa41c, locals=0x0) at Objects/frameobject.c:569
#1 0x080aa708 in PyEval_EvalCodeEx (co=0x402ea7a0, globals=0x402aa41c,
locals=0x0, args=0x402f64f8, argcount=1, kws=0x0, kwcount=0, defs=0x0,
defcount=0, closure=0x0) at Python/ceval.c:2698
#2 0x081043a0 in function_call (func=0x402f0844, arg=0x402f64ec, kw=0x0)
at Objects/funcobject.c:506
#3 0x0805cdd9 in PyObject_Call (func=0x402f0844, arg=0x402aa41c,
kw=0x402aa41c) at Objects/abstract.c:1757
#4 0x08063844 in instancemethod_call (func=0x402f0844, arg=0x402f64ec,
kw=0x402aa41c) at Objects/classobject.c:2454
#5 0x0805cdd9 in PyObject_Call (func=0x402f7bbc, arg=0x402aa41c,
kw=0x402aa41c) at Objects/abstract.c:1757
#6 0x080ab978 in PyEval_CallObjectWithKeywords (func=0x402aa41c,
arg=0x4029d02c, kw=0x402f7bbc) at Python/ceval.c:3619
#7 0x0805cd7e in PyObject_CallObject (o=0x402aa41c, a=0x402aa41c)
at Objects/abstract.c:1747
I find no solution to solve this problem, can you help me and give me
some clues
Thanks you very much
Jol
_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://www.stackless.com/mailman/listinfo/stackless
More information about the Stackless
mailing list