Robert Bradshaw schrieb am 08.09.2017 um 06:36:
> On Wed, Sep 6, 2017 at 3:53 AM, Stefan Behnel wrote:
>> consider this code:
>>
>>     cdef np.ndarray[int32, ndim=1] a
>>     a = new_int32_buffer()
>>     a = new_float32_buffer()
>>
>> This fails during the second assignment, but only during validation, after
>> unpacking the buffer. The code that handles this case is generated here:
>>
>> https://github.com/cython/cython/blob/c95ca9f21a3524718a83c3415bb7102a508154be/Cython/Compiler/Buffer.py#L376
>>
>> Note the twist where it says:
>>
>>         # If acquisition failed, attempt to reacquire the old buffer
>>         # before raising the exception.
>>
>> I faintly remember a discussion about that case (apparently back in 2008),
>> but can't find it in my mail archive. Might have been off-list at the time.
>>
>> Question: Instead of re-acquiring the buffer (and thus faking the
>> non-assignment), wouldn't it be better to acquire the new buffer in a temp,
>> and only overwrite the old "Py_buffer" if all is fine with it?
> 
> That makes a lot more sense to me, assuming overwriting is cheap enough.

It's just a Py_buffer struct copy.


> Can an error happen in releasing the old value?

No, releasing buffers is guaranteed to succeed (or rather, to not fail).

While working on this, I noticed that there is a difference. Previously,
the acquire-release order was:

   1) acquire initial buffer
   2) on reassign, release old buffer
   3) acquire new buffer
   4) on failure, re-aqcuire old buffer

Now the order is:

   1) acquire initial buffer
   2) on reassign, acquire new buffer
   3) on success, release old buffer

Note that the original code never holds two buffers at the same time. I
think the old way might have been optimised for that, i.e. it expected
success and tried to minimise the potential resource usage, assuming that
acquiring and holding a buffer might bind resources of the owner.

It's unclear to me whether that assumption holds, but it makes me more
hesitant to change the currect implementation.

Stefan
_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to