[C++-sig] boost::python::len( list_object) throws "Access violation" (MSDev v9/Boost 1.41)
John McLaughlin
jmclaughlin at istor.com
Mon Apr 26 23:31:44 CEST 2010
I believe I have found my problem.
I was allowing the GIL to be released (essentially letting multiple
threads run concurrently) but the " const boost::python::list & disks"
argument was not protected at this point.
I can either move the Py_BEGIN_ALLOW_THREADS call to after I am finished
accessing the "disks" arg, or use Py_BLOCK_THREADS and
Py_UNBLOCK_THREADS to protect access calls.
John
John McLaughlin
iStor Networks, Inc.
-----Original Message-----
From: John McLaughlin
Sent: Friday, April 23, 2010 8:01 PM
To: 'cplusplus-sig at python.org.'
Subject: boost::python::len( list_object) throws "Access violation"
(MSDev v9/Boost 1.41)
I have a strange crash in my C++ method when called from Python. I have
a method that has one of the arguments a Python List. The symptoms are
the same with an empty list and a non-empty one.
In one method, early in the code I call;
boost::python::len( var )
and it returns properly.
HOWEVER, in another method, I am passing the *same value* from Python,
but the "boost::python::len( var )" aborts when "PyErr_Occurred()" is
called. It causes an access violation (like a bad pointer dereference).
What is strange is that the line before (calling
PyObject_Length(obj.ptr() ) returns a proper size.
Any ideas?
------------------------------------------------------
namespace boost { namespace python {
inline ssize_t len(object const& obj)
{
ssize_t result = PyObject_Length(obj.ptr());
if (PyErr_Occurred()) throw_error_already_set();
return result;
}
}} // namespace boost::python
------------------------------------------------------
void PyService_Volume::Reconfigure(
const PyStorageSize & sizeInBytes,
const
iStor::UserAgent::UAEnums::VolumeCompositionName & compositionName,
const boost::python::list & disks,
int stripeWidth,
const iStor::UserAgent::UAEnums::StripeDepth &
stripeDepth)
{
Py_BEGIN_ALLOW_THREADS
.
.
.
if (boost::python::len(disks) > 0)
{
...
------------------------------------------------------
John McLaughlin
iStor Networks, Inc.
More information about the Cplusplus-sig
mailing list