Message128503
> > Hmm, there's a misunderstanding. bf_releasebuffer is called exactly
> > once for each call to bf_getbuffer.
>
> Wrong: http://bugs.python.org/issue7433
This is a different issue.
> static int
> memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
> {
> int res = 0;
> CHECK_RELEASED_INT(self);
> if (self->view.obj != NULL)
> res = PyObject_GetBuffer(self->view.obj, view, flags);
> if (view)
> dup_buffer(view, &self->view);
> return res;
> }
>
> After this, PyBuffer_Release will be called twice: once on the data in
> *view, by whoever acquired the buffer from memoryview
> , and once on self->view, by memory_dealloc.
PyObject_GetBuffer() is called twice too: once when creating the
memoryview, once when calling memory_getbuf.
So again, bf_getbuffer is called the same number of times as
bf_releasebuffer.
> Note that the view.internal pointer is also clobbered above.
Are you sure? memoryobject.c doesn't touch that pointer at all.
> > > So, `bf_releasebuffer` cannot be used to release any resources
> > > allocated in `bf_getbuffer`.
> >
> > AFAICT, it can. That's what the "internal" pointer is for.
>
> Sure, guaranteeing that view->internal pointer is not toyed with would
> also be enough.
>
> But the documentation should spell out very explicitly what the
> bf_releasebuffer call can rely on.
Yes. |
|
Date |
User |
Action |
Args |
2011-02-13 15:02:14 | pitrou | set | recipients:
+ pitrou, loewis, teoliphant, mark.dickinson, ncoghlan, rupole, kermode, pv |
2011-02-13 15:02:14 | pitrou | link | issue10181 messages |
2011-02-13 15:02:14 | pitrou | create | |
|