/* Public interface */
-uint32_t xcb_get_maximum_request_length(xcb_connection_t *c)
+void xcb_prefetch_maximum_request_length(xcb_connection_t *c)
{
if(c->has_error)
- return 0;
+ return;
pthread_mutex_lock(&c->out.reqlenlock);
- if(!c->out.maximum_request_length)
+ if(c->out.maximum_request_length_tag == LAZY_NONE)
{
const xcb_query_extension_reply_t *ext;
- c->out.maximum_request_length = c->setup->maximum_request_length;
ext = xcb_get_extension_data(c, &xcb_big_requests_id);
if(ext && ext->present)
{
- xcb_big_requests_enable_reply_t *r = xcb_big_requests_enable_reply(c, xcb_big_requests_enable(c), 0);
- c->out.maximum_request_length = r->maximum_request_length;
+ c->out.maximum_request_length_tag = LAZY_COOKIE;
+ c->out.maximum_request_length.cookie = xcb_big_requests_enable(c);
+ }
+ else
+ {
+ c->out.maximum_request_length_tag = LAZY_FORCED;
+ c->out.maximum_request_length.value = c->setup->maximum_request_length;
+ }
+ }
+ pthread_mutex_unlock(&c->out.reqlenlock);
+}
+
+uint32_t xcb_get_maximum_request_length(xcb_connection_t *c)
+{
+ if(c->has_error)
+ return 0;
+ xcb_prefetch_maximum_request_length(c);
+ pthread_mutex_lock(&c->out.reqlenlock);
+ if(c->out.maximum_request_length_tag == LAZY_COOKIE)
+ {
+ xcb_big_requests_enable_reply_t *r = xcb_big_requests_enable_reply(c, c->out.maximum_request_length.cookie, 0);
+ c->out.maximum_request_length_tag = LAZY_FORCED;
+ if(r)
+ {
+ c->out.maximum_request_length.value = r->maximum_request_length;
free(r);
}
+ else
+ c->out.maximum_request_length.value = c->setup->maximum_request_length;
}
pthread_mutex_unlock(&c->out.reqlenlock);
- return c->out.maximum_request_length;
+ return c->out.maximum_request_length.value;
}
unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *req)
uint16_t len;
} fields;
uint32_t packet;
- } sync = { { /* GetInputFocus */ 43, 0, 1 } };
+ } sync_req = { { /* GetInputFocus */ 43, 0, 1 } };
unsigned int request;
uint32_t prefix[3] = { 0 };
int veclen = req->count;
if(!(flags & XCB_REQUEST_RAW))
{
static const char pad[3];
- int i;
+ unsigned int i;
uint16_t shortlen = 0;
size_t longlen = 0;
assert(vector[0].iov_len >= 4);
pthread_cond_wait(&c->out.cond, &c->iolock);
request = ++c->out.request;
- /* send GetInputFocus (sync) when 64k-2 requests have been sent without
+ /* send GetInputFocus (sync_req) when 64k-2 requests have been sent without
* a reply.
- * Also send sync (could use NoOp) at 32-bit wrap to avoid having
+ * Also send sync_req (could use NoOp) at 32-bit wrap to avoid having
* applications see sequence 0 as that is used to indicate
* an error in sending the request */
while((req->isvoid &&
c->out.request == c->in.request_expected + (1 << 16) - 1) ||
request == 0)
{
- prefix[0] = sync.packet;
+ prefix[0] = sync_req.packet;
_xcb_in_expect_reply(c, request, WORKAROUND_NONE, XCB_REQUEST_DISCARD_REPLY);
c->in.request_expected = c->out.request;
request = ++c->out.request;
if(pthread_mutex_init(&out->reqlenlock, 0))
return 0;
- out->maximum_request_length = 0;
+ out->maximum_request_length_tag = LAZY_NONE;
return 1;
}