Skip to content

BUG: Fix memory leak of buffer-info cache due to relaxed strides#17647

Merged
charris merged 3 commits intonumpy:maintenance/1.19.xfrom
charris:backport-16936
Oct 27, 2020
Merged

BUG: Fix memory leak of buffer-info cache due to relaxed strides#17647
charris merged 3 commits intonumpy:maintenance/1.19.xfrom
charris:backport-16936

Conversation

@charris
Copy link
Copy Markdown
Member

@charris charris commented Oct 27, 2020

Backport of #16936.

When relaxed strides is active (and has an effect), we recalculate
the strides to export "clean" strides in the buffer interface.
(Python and probably some other exporters expect this, i.e. NumPy
has fully switched to and embraced relaxed strides, but the buffer
interface at large probably not.)

The place where "fixing" the strides occured however meant that
when the strides are fixed, the old, cached buffer-info was not
reused when it should have been reused.

This moves the "fixing" logic so that reuse will occur. It leaves
one issue open in that an array shaped e.g. (1, 10) is both
C- and F-contiguous. Thus, if it is exported as C-contiguous and
then as F-contiguous, and then again as C-contiguous, this will
work, but the last export will compare to the export as an F-contig
buffer and thus still leak memory.

Address gh-16934 (but does leave a small hole)

When relaxed strides is active (and has an effect), we recalculate
the strides to export "clean" strides in the buffer interface.
(Python and probably some other exporters expect this, i.e. NumPy
has fully switched to and embraced relaxed strides, but the buffer
interface at large probably not.)

The place where "fixing" the strides occured however meant that
when the strides are fixed, the old, cached buffer-info was not
reused when it should have been reused.

This moves the "fixing" logic so that reuse will occur.  It leaves
one issue open in that an array shaped e.g. `(1, 10)` is both
C- and F-contiguous. Thus, if it is exported as C-contiguous and
then as F-contiguous, and then *again* as C-contiguous, this will
work, but the last export will compare to the export as an F-contig
buffer and thus still leak memory.

Address numpygh-16934 (but does leave a small hole)
Exporting these multiple times alternating would previously cause
a new buffer-info to be created each time.
@charris charris added this to the 1.19.3 release milestone Oct 27, 2020
@charris charris merged commit 0a991d6 into numpy:maintenance/1.19.x Oct 27, 2020
@charris charris deleted the backport-16936 branch October 27, 2020 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants