Hi Jorge,
This is correct to my knowledge offsets are not modelled in IPC.  There was
a lot of debate on whether to include them in the c data interface.

Cheers,
Micah

On Friday, February 12, 2021, Jorge Cardoso Leitão <jorgecarlei...@gmail.com>
wrote:

> Hi,
>
> I am going through the Rust implementation of the IPC, and I am trying to
> understand how we share Arraydata offsets.
>
> Specifically, our C data interface supports the notion of an offset,
> measured in slots, that denotes how many slots ahead of the buffer pointers
> we read from. This enables us to share buffers between arrays, as we can
> create a new array out of an existing array by slicing, and have its offset
> increased.
>
> However, I can't find this notion in our IPC format. We could argue that
> IPC format does not support that, and that we should just slice our buffers
> before encoding them to the message. That works for any type whose
> bit_width is a multiple of 8, but I can't see this to work for bitmap
> buffers: when we have an offset of 3 < 8 slots and a buffer with a validity
> bitmap, we can't slice that buffer by 3 bits. If we do not share the offset
> information and the consumer assumes an offset of 0, we will be consuming a
> buffer offsetted by 0, and we lost the 3 in communication, thereby
> incorrectly reconstructing the validity bitmap.
>
> One solution is to assume an offset of zero when reading from IPC. But afai
> understand, in that case, producers must themselves only share bitmap
> buffers that are aligned at "8 bit boundaries". For example, an array with
> offset 3, len 12 and a (shared) validity buffer with
>
> 01101010, 01101010
>
> can't just write the above to the message; it must write the "new" below:
>
> new: (010){01101}, 0000[1101]
> old: {01101}010, 0[1101](010)  # 12 + 3 = 15, unbracket bits are ignored
>
> i.e. skip the first 3 bits from the first byte and shift all bits
> accordingly.
>
> Is this reasoning correct? Is this the intention?
>
> Best,
> Jorge
>

Reply via email to