danepitkin commented on code in PR #340:
URL: https://github.com/apache/arrow-nanoarrow/pull/340#discussion_r1446273998
##########
python/src/nanoarrow/__init__.py:
##########
@@ -15,5 +15,11 @@
# specific language governing permissions and limitations
# under the License.
-from ._lib import Array, ArrayStream, ArrayView, Schema, c_version # noqa:
F401
-from .lib import array, array_stream, schema, array_view # noqa: F401
+from nanoarrow._lib import cversion # noqa: F401
Review Comment:
is it worth changing this back to `c_version`?
##########
python/src/nanoarrow/_lib.pyx:
##########
@@ -76,116 +81,96 @@ cdef void pycapsule_array_deleter(object array_capsule)
noexcept:
if array.release != NULL:
ArrowArrayRelease(array)
- free(array)
+ ArrowFree(array)
cdef object alloc_c_array(ArrowArray** c_array) noexcept:
- c_array[0] = <ArrowArray*> malloc(sizeof(ArrowArray))
+ c_array[0] = <ArrowArray*> ArrowMalloc(sizeof(ArrowArray))
# Ensure the capsule destructor doesn't call a random release pointer
c_array[0].release = NULL
return PyCapsule_New(c_array[0], 'arrow_array', &pycapsule_array_deleter)
-cdef void pycapsule_stream_deleter(object stream_capsule) noexcept:
+cdef void pycapsule_array_stream_deleter(object stream_capsule) noexcept:
cdef ArrowArrayStream* stream = <ArrowArrayStream*>PyCapsule_GetPointer(
stream_capsule, 'arrow_array_stream'
)
# Do not invoke the deleter on a used/moved capsule
if stream.release != NULL:
ArrowArrayStreamRelease(stream)
- free(stream)
+ ArrowFree(stream)
-cdef object alloc_c_stream(ArrowArrayStream** c_stream) noexcept:
- c_stream[0] = <ArrowArrayStream*> malloc(sizeof(ArrowArrayStream))
+cdef object alloc_c_array_stream(ArrowArrayStream** c_stream) noexcept:
+ c_stream[0] = <ArrowArrayStream*> ArrowMalloc(sizeof(ArrowArrayStream))
# Ensure the capsule destructor doesn't call a random release pointer
c_stream[0].release = NULL
- return PyCapsule_New(c_stream[0], 'arrow_array_stream',
&pycapsule_stream_deleter)
-
-
-cdef void arrow_array_release(ArrowArray* array) noexcept with gil:
- Py_DECREF(<object>array.private_data)
- array.private_data = NULL
- array.release = NULL
-
-
-cdef class SchemaHolder:
- """Memory holder for an ArrowSchema
-
- This class is responsible for the lifecycle of the ArrowSchema
- whose memory it is responsible for. When this object is deleted,
- a non-NULL release callback is invoked.
- """
- cdef ArrowSchema c_schema
-
- def __cinit__(self):
- self.c_schema.release = NULL
+ return PyCapsule_New(c_stream[0], 'arrow_array_stream',
&pycapsule_array_stream_deleter)
- def __dealloc__(self):
- if self.c_schema.release != NULL:
- ArrowSchemaRelease(&self.c_schema)
- def _addr(self):
- return <uintptr_t>&self.c_schema
+cdef void pycapsule_device_array_deleter(object device_array_capsule) noexcept:
+ cdef ArrowDeviceArray* device_array =
<ArrowDeviceArray*>PyCapsule_GetPointer(
+ device_array_capsule, 'arrow_device_array'
+ )
+ # Do not invoke the deleter on a used/moved capsule
+ if device_array.array.release != NULL:
+ device_array.array.release(&device_array.array)
+ ArrowFree(device_array)
-cdef class ArrayHolder:
- """Memory holder for an ArrowArray
- This class is responsible for the lifecycle of the ArrowArray
- whose memory it is responsible. When this object is deleted,
- a non-NULL release callback is invoked.
- """
- cdef ArrowArray c_array
+cdef object alloc_c_device_array(ArrowDeviceArray** c_device_array) noexcept:
+ c_device_array[0] = <ArrowDeviceArray*>
ArrowMalloc(sizeof(ArrowDeviceArray))
+ # Ensure the capsule destructor doesn't call a random release pointer
+ c_device_array[0].array.release = NULL
+ return PyCapsule_New(c_device_array[0], 'arrow_device_array',
&pycapsule_device_array_deleter)
- def __cinit__(self):
- self.c_array.release = NULL
- def __dealloc__(self):
- if self.c_array.release != NULL:
- ArrowArrayRelease(&self.c_array)
+cdef void pycapsule_array_view_deleter(object array_capsule) noexcept:
+ cdef ArrowArrayView* array_view = <ArrowArrayView*>PyCapsule_GetPointer(
+ array_capsule, 'nanoarrow_array_view'
+ )
- def _addr(self):
- return <uintptr_t>&self.c_array
+ ArrowArrayViewReset(array_view)
-cdef class ArrayStreamHolder:
- """Memory holder for an ArrowArrayStream
+ ArrowFree(array_view)
- This class is responsible for the lifecycle of the ArrowArrayStream
- whose memory it is responsible. When this object is deleted,
- a non-NULL release callback is invoked.
- """
- cdef ArrowArrayStream c_array_stream
- def __cinit__(self):
- self.c_array_stream.release = NULL
+cdef object alloc_c_array_view(ArrowArrayView** c_array_view) noexcept:
+ c_array_view[0] = <ArrowArrayView*> ArrowMalloc(sizeof(ArrowArrayView))
+ ArrowArrayViewInitFromType(c_array_view[0], NANOARROW_TYPE_UNINITIALIZED)
+ return PyCapsule_New(c_array_view[0], 'nanoarrow_array_view',
&pycapsule_array_view_deleter)
- def __dealloc__(self):
- if self.c_array_stream.release != NULL:
- ArrowArrayStreamRelease(&self.c_array_stream)
- def _addr(self):
- return <uintptr_t>&self.c_array_stream
+# To more safely implement export of an ArrowArray whose address may be
+# dependend on by some other Python object, we implement a shallow copy
Review Comment:
```suggestion
# depended on by some other Python object, we implement a shallow copy
```
##########
python/src/nanoarrow/device.py:
##########
@@ -15,15 +15,15 @@
# specific language governing permissions and limitations
# under the License.
-from nanoarrow._lib import Device, DeviceArray
-from nanoarrow.lib import array
+from nanoarrow._lib import CDeviceArray, Device
+from nanoarrow.c_lib import c_array
-def device_array(obj):
- if isinstance(obj, DeviceArray):
+def cdevice_array(obj):
Review Comment:
can also change to `c_device_array` here!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]