[C++-sig] sp_counted_impl_pd with shared_ptr_deleter

Gabriel Becedillas gabriel.becedillas at corest.com
Tue May 29 20:06:25 CEST 2007


I have the following problem:
1_) A boost::shared_ptr<T> is converted to python.
2_) The PyObject holding the boost::shared_ptr<T> is converted back from 
python, (apparently) yielding the same boost::shared_ptr<T>.
3_) The boost::shared_ptr<T> hits refcount 0 somewhere else in C++Land 
without holding the Python GIL.
4_) Python's API gets called without holding the GIL because a 
sp_counted_impl_pd with a shared_ptr_deleter modifies the PyObject's 
refcount and Py_Dealloc gets called (check shared_ptr_deleter::operator()).

This is wrong because you shouldn't use Python's API without holding the 
GIL. In my particular case I don't know when or where a 
boost::shared_ptr<T> will hit refcount 0 (thats the funny part of using 
smart pointers).

I took a look around and found that:
1_) shared_ptr_from_python is putting the shared_ptr_deleter.
2_) shared_ptr_to_python is checking if the boost::shared_ptr<T> holds a 
shared_ptr_deleter to get the PyObject inside.

Is there a way to make shared_ptr_from_python return the original 
boost::shared_ptr<T> without changing the 
sp_counted_impl_pd/shared_ptr_deleter ?

Thanks.



More information about the Cplusplus-sig mailing list