On 12/28/06, Robin Becker <[EMAIL PROTECTED]> wrote: > As part of some django usage I need to get some ReportLab C extensions into a > state where they can be safely used with mod_python. > > Unfortunately we have C code that seems incompatible with mod_python and I'm > looking for ways to improve the situation. > > Basically the main things that are wrong are all privately cached copies of > python variables. This sample code > > > static PyObject *_pdfmetrics_fonts = NULL; > static PyObject *_pdfmetrics_ffar = NULL; > > .......... > if(!_pdfmetrics_fonts){ > res = PyImport_ImportModule("reportlab.pdfbase.pdfmetrics"); > if(!res) ERROR_EXIT(); > _o1 = _GetAttrString(res,"_fonts"); > if(!_o1) ERROR_EXIT(); > _o2 = _GetAttrString(res,"findFontAndRegister"); > if(!_o2) ERROR_EXIT(); > _pdfmetrics_fonts = _o1; > _pdfmetrics_ffar = _o2; > Py_DECREF(res); _o1 = _o2 = res = NULL; > } > if((res = PyObject_GetItem(_pdfmetrics_fonts,fontName))) return res; > ........... > > illustrates the general problem. If called first by interpreter A I'll get the > values from interpreter A. When later called by interpreter B I'll be using > the > wrong values and _pdfmetrics_ffar can alter the wrong interpreter's data. > > > The functions themselves are fairly small, but may be called many times so > they're worth speeding up. > > Is there a simple/cheap way for C code to cache these sorts of module level > globals on a per interpreter basis? Is there even a way to tell which > interpreter I'm being called in? > > Anything too costly will probably bust any speedup. Luckily I don't think we > have too many of these cached variables so it's possible we may be able to get > away with just dropping the caching for some and eliminating others. > -- > Robin Becker >
Just off the top of my head, I'd think that using thread-local storage instead of static would work, wouldn't it? I'm not that familiar with mod_python but I'm surely each python interpreter is in a different thread (if not process) than the others. -- http://mail.python.org/mailman/listinfo/python-list