X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_out.c;fp=src%2Fxcb_out.c;h=caf8ef50501972bd635a50d8b4af84f36b58fd26;hb=da4d56ef5a880eb24014a141e6e16668ab51f180;hp=74787e3b763f43139872ec9a4c4b700cbac8a541;hpb=aedfa1fe1d91a10ccfe3ee6ac6b7a25885623dc6;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_out.c b/src/xcb_out.c index 74787e3..caf8ef5 100644 --- a/src/xcb_out.c +++ b/src/xcb_out.c @@ -57,25 +57,49 @@ static int write_block(xcb_connection_t *c, struct iovec *vector, int count) /* 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) @@ -237,7 +261,7 @@ int _xcb_out_init(_xcb_out *out) if(pthread_mutex_init(&out->reqlenlock, 0)) return 0; - out->maximum_request_length = 0; + out->maximum_request_length_tag = LAZY_NONE; return 1; }