Re: Array alignment while marshalling data

Simon McVittie <simon.mcvittie-ZGY8ohtN/[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Organization Collabora Ltd.
Message-ID <[email protected]>
On 23/05/16 19:46, [email protected] wrote:
> the array length is not aligned to 8 bytes, but to 4 bytes. But type of
> this array is struct, which according to the specification should always
> align to 8 bytes.

The header field array isn't a struct, it's an array (which happens to
contain structs). The array length is a 4-byte integer, so it's aligned
to a multiple of 4 bytes. After the length, there are some number of
structs, and *those* are aligned to a multiple of 8 bytes.

In effect, the beginning of every message looks like this:

bytes 0-3: header start, four 1-byte quantities
4-7: body length
8-11: serial
No padding, 12 is already a multiple of 4
12-15: header field array length
No padding, 16 is already a multiple of 8
16+: first header field struct

Let's say the first header field struct happens to be 13 bytes long.
We'd continue as follows:

16-28: first header field struct
29-31: 3 bytes of padding to reach next multiple of 8
32+: second header field struct

(Yes, this means the marshalling for `a(whatever)`, an array of structs,
is not the same as the marshalling for `(a(whatever))`, a struct
containing a single array of structs. There's no particular reason, it's
just how this stuff was designed 10+ years ago.)

Regards,
    S
-- 
Simon McVittie
Collabora Ltd. <http://www.collabora.com/>

_______________________________________________
dbus mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dbus
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.