Skip to content

Commit b2281de

Browse files
authored
Use try...finally... to ensure buffer is released (#728)
Follow up on this discussion: #692 (comment) Ensure that the acquired buffer is properly released even if an exception is raised. Given we may raise an exception, this is important to check. cc @vyasr Authors: - https://github.com/jakirkham Approvers: - Vyas Ramasubramani (https://github.com/vyasr) URL: #728
1 parent a79389c commit b2281de

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

python/kvikio/kvikio/_lib/arr.pyx

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -130,36 +130,37 @@ cdef class Array:
130130
self.strides_mv = None
131131
else:
132132
PyObject_GetBuffer(obj, &pybuf, PyBUF_FULL_RO)
133-
134-
if pybuf.suboffsets != NULL:
135-
raise NotImplementedError("Suboffsets are not supported")
136-
137-
self.ptr = <uintptr_t>pybuf.buf
138-
self.obj = pybuf.obj
139-
self.readonly = <bint>pybuf.readonly
140-
self.ndim = <Py_ssize_t>pybuf.ndim
141-
self.itemsize = <Py_ssize_t>pybuf.itemsize
142-
143-
if self.ndim > 0:
144-
self.shape_mv = new_Py_ssize_t_array(self.ndim)
145-
memcpy(
146-
&self.shape_mv[0],
147-
pybuf.shape,
148-
self.ndim * sizeof(Py_ssize_t)
149-
)
150-
if not PyBuffer_IsContiguous(&pybuf, b"C"):
151-
self.strides_mv = new_Py_ssize_t_array(self.ndim)
133+
try:
134+
if pybuf.suboffsets != NULL:
135+
raise NotImplementedError("Suboffsets are not supported")
136+
137+
self.ptr = <uintptr_t>pybuf.buf
138+
self.obj = pybuf.obj
139+
self.readonly = <bint>pybuf.readonly
140+
self.ndim = <Py_ssize_t>pybuf.ndim
141+
self.itemsize = <Py_ssize_t>pybuf.itemsize
142+
143+
if self.ndim > 0:
144+
self.shape_mv = new_Py_ssize_t_array(self.ndim)
152145
memcpy(
153-
&self.strides_mv[0],
154-
pybuf.strides,
146+
&self.shape_mv[0],
147+
pybuf.shape,
155148
self.ndim * sizeof(Py_ssize_t)
156149
)
150+
if not PyBuffer_IsContiguous(&pybuf, b"C"):
151+
self.strides_mv = new_Py_ssize_t_array(self.ndim)
152+
memcpy(
153+
&self.strides_mv[0],
154+
pybuf.strides,
155+
self.ndim * sizeof(Py_ssize_t)
156+
)
157+
else:
158+
self.strides_mv = None
157159
else:
160+
self.shape_mv = None
158161
self.strides_mv = None
159-
else:
160-
self.shape_mv = None
161-
self.strides_mv = None
162-
PyBuffer_Release(&pybuf)
162+
finally:
163+
PyBuffer_Release(&pybuf)
163164

164165
cpdef bint _c_contiguous(self):
165166
return _c_contiguous(

0 commit comments

Comments
 (0)