[cairo] [PATCH 2/2] xcb: Use SHM FD-passing if possible
Chris Wilson
chris at chris-wilson.co.uk
Fri Apr 6 13:38:13 UTC 2018
Quoting Alexander Volkov (2018-04-06 13:33:37)
> + if (connection->flags & CAIRO_XCB_HAS_SHM_FD) {
> + xcb_shm_create_segment_cookie_t cookie;
> + xcb_shm_create_segment_reply_t *reply;
> + xcb_generic_error_t *error;
> + int *fds;
> + int err;
> +
> + if (unlikely (size > UINT32_MAX))
> + return CAIRO_STATUS_NO_MEMORY;
That's not the protocol limit, surely? It may well be, just a bit
surprising if it was.
> + shm->shmseg = _cairo_xcb_connection_get_xid (connection);
> + cookie = xcb_shm_create_segment (connection->xcb_connection, shm->shmseg, size, FALSE);
> + reply = xcb_shm_create_segment_reply (connection->xcb_connection, cookie, &error);
> + if (error) {
> + free (error);
> + _cairo_xcb_connection_put_xid (connection, shm->shmseg);
> + return CAIRO_INT_STATUS_UNSUPPORTED;
> + }
> +
> + fds = xcb_shm_create_segment_reply_fds (connection->xcb_connection, reply);
> + if (reply->nfd != 1) {
> + for (int i = 0; i < reply->nfd; i++)
> + close (fds[i]);
> +
> + free (reply);
> + xcb_shm_detach (connection->xcb_connection, shm->shmseg);
> + _cairo_xcb_connection_put_xid (connection, shm->shmseg);
> + return CAIRO_INT_STATUS_UNSUPPORTED;
> + }
> +
> + shm->shm = mmap (NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fds[0], 0);
A roundtrip on allocation. That doesn't seem like something we would want
in a frequent path? And creating temporary surfaces is frequent enough.
That would suggest to me that we want an allocation cache... And packing
into a larger object?
-Chris
More information about the cairo
mailing list