Hello Todd,

Le 06/04/2020 à 18:18, Todd Lipcon a écrit :
> 
> I had a couple questions / items that should be clarified in the spec. Wes
> suggested I raise them here on dev@:
> 
> *1) Should producers expect callers to zero-init structs?*

IMO, they shouldn't.  They should fill the structure exhaustively.
Though ultimately it's a decision made by the implementer of the
producer API.

> I suppose since it's the "C interface" it's
> probably best to follow the C-style "producer assumes the argument contains
> uninitialized memory" convention.

Exactly.

> *2) Clarify lifetime semantics for nested structures*
> 
> In my application, i'd like to allocate all of the children structures of
> an ArrowSchema or ArrowArray out of a memory pool which is stored in the
> private_data field of the top-level struct. As such, my initial
> implementation was to make the 'release' callback on the top-level struct
> delete that memory pool, and set the 'release' callback of all children
> structs to null, since their memory was totally owned by the top-level
> struct.
> 
> I figured this approach was OK because the spec says:
> 
>>  Consumers MUST call a base structure's release callback when they won't
> be using it anymore, but they MUST not call any of its children's release
> callbacks (including the optional dictionary). The producer is responsible
> for releasing the children.
> 
> That advice seems to indicate that I can do whatever I want with the
> release callback of the children, including not setting it.

... Except that in this case, moving a child wouldn't be possible.

> This section of the spec also seems to be a bit in conflict with the
> following:
> 
>> It is possible to move a child array, but the parent array MUST be
> released immediately afterwards, as it won't point to a valid child array
> anymore. This satisfies the use case of keeping only a subset of child
> arrays, while releasing the others.
> 
> ... because if you have a parent array which owns the memory referred to by
> the child, then moving the child (with a no-op release callback) followed
> by releasing the parent, you'll end up with an invalid or deallocated child
> as well.

I think the solution here is for your memory pool to be
reference-counted, and have each release callback in the array tree
decrement the reference count.  Does that sound reasonable to you?

Best regards

Antoine.

Reply via email to