[C++-sig] boost.python call_method+thread => wrong exceptionhandling?

Nox 7Bitfaster nox at 7bitfaster.de
Fri May 20 10:11:30 CEST 2011


An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20110520/d6c7272b/attachment.html>
-------------- next part --------------


Hi,
Im currently working with boost.python and stumpled into a strang behavior. If I call a not existing method with call_method from the main thread everything works as excepted (exception is raised and handled in python) but if I call it from a seperate thread call_method does not raise a c++ runtime exception and the hole program crashes. Both cases can be switched by exchanging do_file1 with do_file2 in the testcode. Has someone an idea what I am doing wrong?
Minimal testcase: http://codepad.org/7OMMBZGQ 
Tested with: boost 1.46.1 (statically linked) and python 2.6.5 under windows vista 32 bit
Or as a plain code:
#include <windows.h>
#include "boost/thread.hpp"
#include "boost/python.hpp"
using boost::noncopyable;
using namespace boost::python;
struct Interface
{
PyObject *self;
public:
Interface(PyObject* s) : self(s) {}
static void Thread(Interface* obj)
{
obj->func();
}
void start_thread(void)
{
boost::thread::thread(Interface::Thread, this);
}
void func(void)
{
PyGILState_STATE gstate = PyGILState_Ensure();
call_method<void>(self, "not_existing_function_should_raise_an_exception");
PyGILState_Release(gstate);
}
};
// specialize has_back_reference for Entity
namespace boost { namespace python
{
template <> struct has_back_reference<Interface> : mpl::true_ {};
}}

BOOST_PYTHON_MODULE(test)
{
class_<Interface,noncopyable>("Interface")
.def("start_thread", &Interface::start_thread)
.def("func", &Interface::func)
;
}
int main( int argc, char ** argv )
{
PyImport_AppendInittab( "test", &inittest );
Py_Initialize();
PyEval_InitThreads();
const char* do_file1 = "import testnobj = test.Interface()nobj.func()"; //raises the correct exception
const char* do_file2 = "import testnobj = test.Interface()nobj.start_thread()nwhile 1: pass"; //raises no exception at all
PyRun_SimpleString(do_file2);
return 0;
}


More information about the Cplusplus-sig mailing list