[Python-Dev] An updated extended buffer PEP

Travis E. Oliphant oliphant.travis at ieee.org
Tue Mar 27 21:30:51 CEST 2007


Greg Ewing wrote:
> Here's another idea, to allow multiple views of the same
> buffer with different shape/stride info to coexist, but
> without extra provider objects or refcount weirdness.
> Also it avoids using calls with a brazillion arguments.
> 
>    struct bufferinfo {
>      void **buf;
>      Py_ssize_t *len;
>      int *writeable;
>      char **format;
>      int *ndims;
>      Py_ssize_t **shape;
>      Py_ssize_t **strides;
>      int **isptr;
>    };
> 
>    int (*getbuffer)(PyObject *obj, struct bufferinfo *info);
> 
>    int (*releasebuffer)(PyObject *obj, struct bufferinfo *info);
>

This is not much different from my original "view" object.  Stick a 
PyObject_HEAD at the start of this bufferinfo and you have it.

Memory management was the big reason I wanted to do something like this.

I don't see why a PyObject_HEAD would make anything significantly 
slower.  Then we could use Python's memory management very easily to 
create and destroy these things.  This bufferinfo object would become 
the "provider" I was talking about.

> If the object has constant shape/stride info, it just fills
> in the info struct with pointers to its own memory, and does
> nothing when releasebuffer is called (other than unlocking
> its buffer).
> 
> If its shape/stride info can change, it mallocs memory for
> them and copies them into the info struct. When releasebuffer
> is called, it frees this memory.

> 
> It is the responsibility of the consumer to ensure that the
> base object remains alive until releasebuffer has been called
> on the info struct (to avoid leaking any memory that has
> been malloced for shapes/strides).

This is a reasonable design choice.  I actually prefer to place all the 
buffer information in a single object rather than the multiple argument 
design because it scales better and is easier to explain and understand.

-Travis



More information about the Python-Dev mailing list