[Python-Dev] C API for gc.enable() and gc.disable() (original) (raw)

Andrey Zhmoginov azhmogin at Princeton.EDU
Thu Sep 4 05:41:03 CEST 2008


Would anyone mind if I did add a public C API for gc.disable() and gc.enable()? I would like to use it as an optimization for the pickle module (I found out that I get a good 2x speedup just by disabling the GC while loading large pickles). Of course, I could simply import the gc module and call the functions there, but that seems overkill to me. I included the patch below for review. I don't know if the following question is relevant, but it seems that many people here are familiar with Python cyclic garbage collector. I see Python [v2.5.2 (r252:60911, Jul 31 2008, 17:28:52)] crashing with Segment fault when I extend Python with a very simple module. This behavior is observed when I create a thousand of lists (it does not crash with 10-100) in the module with the garbage collector turned on. When I turn it off - everything is perfect. I suspect that it is my module, but if it is a Python bug ( _GC_Malloc? memory leak somewhere?), it may be worth reporting.

The gdb "where" reply is the following:

#0  0x080d8de9 in PyErr_Occurred ()
#1  0x080f508f in _PyObject_GC_Malloc ()
#2  0x080f5155 in _PyObject_GC_New ()
#3  0x08079c98 in PyList_New ()
#4  0xb7f53519 in draw_d_simple () from ./rt/rt_core.so
#5  0xb7cf7833 in ffi_call_SYSV () from 

/usr/lib/python2.5/lib-dynload/_ctypes.so #6 0xb7cf766a in ffi_call () from /usr/lib/python2.5/lib-dynload/_ctypes.so #7 0xb7cf2534 in _CallProc () from /usr/lib/python2.5/lib-dynload/_ctypes.so #8 0xb7cec02a in ?? () from /usr/lib/python2.5/lib-dynload/_ctypes.so #9 0x0805cb97 in PyObject_Call () #10 0x080c7aa7 in PyEval_EvalFrameEx () #11 0x080c96e5 in PyEval_EvalFrameEx () #12 0x080cb1f7 in PyEval_EvalCodeEx () #13 0x080cb347 in PyEval_EvalCode () #14 0x080ea818 in PyRun_FileExFlags () #15 0x080eaab9 in PyRun_SimpleFileExFlags () #16 0x08059335 in Py_Main () #17 0x080587f2 in main ()

The crashing python code is:

from ctypes import *
import gc
core = CDLL( "./tst.so" )
core.a.argtypes = []
core.a.restype = py_object
#gc.disable()
core.a()
#gc.enable()

And tst.cpp is:

#include <Python.h>
extern "C" { PyObject *a(); }
PyObject *a()
{
    int n = 1000;
    PyObject *item;
    for ( int i = 0; i < n; i++ ) item = PyList_New( 0 );      // 

Crashes here (somewhere in between). return item; }

tst.cpp is compiled with:

g++ -shared -Wl,-soname,tst.tmp.so -o tst.so tst.o
g++ -I /usr/include/python2.5 -Wall -fPIC -o tst.o -c tst.cpp

Thanks for your help!



More information about the Python-Dev mailing list