Re: [EXTERNAL] - Details on using xcb_send_request()?

Peter Harris <pharris-gGaKbNYk6w1Wk0Htik3J/[email protected]> Thu, 4 Feb 2021 14:55:23 +0000
Newsgroups gmane.comp.freedesktop.xcb
Message-ID <YTXPR0101MB15829DCAAEDCE334C6826B44DFB39@YTXPR0101MB1582.CANPRD01.PROD.OUTLOOK.COM>
On 2021-02-03 Junk Mail wrote:
> xcb_parts[3].iov_base = 0;
> xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3; // why?

Why? Padding / alignment. The next thing on the wire must be aligned to its natural size (a multiple of 4 bytes in this case).

> xcb_parts[4].iov_base = (char *) value_list; xcb_parts[4].iov_len =
> xcb_popcount(value_mask) * sizeof(uint32_t);
> 
> xcb_parts[5].iov_base = 0;
> xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3; // why?

Why? Padding / alignment. Every X11 request must be a multiple of 4 bytes. In this particular case, we can see that it is already aligned, so this will always have an iov_len of 0 (and thus nothing will be sent to the server for this part). The xcb generator is conservative and always emits this at the end of every request.

> It seems like there are "delimiters" (index 3 and 5 of xcb_parts, 
> which is of type struct iovec), and their lengths are always the 
> negative value of the length of the previous index AND'd with 3, I 
> have found nothing obvious that could shed light

It's a fast way to calculate the number of bytes of padding needed to "round up" to the required alignment.

See, for example, https://stackoverflow.com/questions/20844983/what-is-the-best-way-to-calculate-number-of-padding-bytes for other ways to calculate this value.

Peter Harris