per interpreter storage for C extensions

Chris Mellon arkanes at gmail.com
Thu Dec 28 11:32:46 EST 2006


On 12/28/06, Robin Becker <robin at reportlab.com> 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.



More information about the Python-list mailing list