[C++-sig] Thread safety (original) (raw)
dueymk dueymk at everestkc.net
Fri Dec 16 20:36:34 CET 2005
- Previous message: [C++-sig] pyterralib
- Next message: [C++-sig] Thread safety
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi, I'm wrapping a multi-threaded C++ dll with Boost.Python. A thread is created when a wrapped structure is subclassed and instantiated in Python. This thread spends most of it's time in C++ but calls a virtual function which may be overridden by the Python subclass. I've done the following:
class Original { int counter;
virtual bool Process(int *count)
{
*count++;
return true;
}
}
struct PythonOriginal : Original, wrapper { bool Process(int *count) { if (override Process = this->get_override("Process")) { PyGILState_STATE gstate; gstate = PyGILState_Ensure();
bool answer = call<bool>(Process.ptr(), boost::ref(count));
PyGILState_Release(gstate);
return answer;
}
else
return Original::Process(count);
}
bool default_Process(int *count)
{
return this->PleoraCamera::ProcessFrame(count);
}
}
BOOST_PYTHON_MODULE(PythonOriginal) { class_<PythonOriginal, boost::noncopyable >("Original") .def("Process", &Original::Process, &PythonOriginal::default_Process) ; }
Then in Python:
class PyOrig(Original): def Process(self, count): count = count + 10 return True
orig = PyOrig()
The only thing I did for thread safety was to add the PyGILState calls to the virtual function wrapper around the call<>. After all that, my question is, is that sufficient? Also, are there any obvious problems with this example. It seems to work fine.
Jim
- Previous message: [C++-sig] pyterralib
- Next message: [C++-sig] Thread safety
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]