From d2ad10d03be8e6d4b150bbdf2a28ea3d5a18a2ed Mon Sep 17 00:00:00 2001 From: marha Date: Sun, 13 Apr 2014 14:24:56 +0200 Subject: fontconfig libxcb mesa xserver xcb-proto git update 13 Apr 2014 xserver commit 3028ae6c9aa37168e249e0d847b29f8e3efb05b2 libxcb commit 29e419c5840a1eeda3336a0802686ee723dcaab3 libxcb/xcb-proto commit 70fea02b7d90d86e9d3b0dc5b61406bf4c910999 pixman commit 4b76bbfda670f9ede67d0449f3640605e1fc4df0 fontconfig commit f44157c809d280e2a0ce87fb078fc4b278d24a67 mesa commit 936dda08ee6d7b2be2b016bc06780e401088ec13 --- libxcb/src/xcb_out.c | 57 +++++++++++++++++++++++++----------- libxcb/src/xcb_util.c | 17 ++++++----- libxcb/xcb-proto/src/dri2.xml | 2 +- libxcb/xcb-proto/src/xf86vidmode.xml | 2 +- libxcb/xcb-proto/src/xinput.xml | 2 +- libxcb/xcb-proto/src/xprint.xml | 4 ++- 6 files changed, 55 insertions(+), 29 deletions(-) (limited to 'libxcb') diff --git a/libxcb/src/xcb_out.c b/libxcb/src/xcb_out.c index 18bb5f912..dc4295467 100644 --- a/libxcb/src/xcb_out.c +++ b/libxcb/src/xcb_out.c @@ -103,6 +103,33 @@ static void get_socket_back(xcb_connection_t *c) _xcb_in_replies_done(c); } +static void prepare_socket_request(xcb_connection_t *c) +{ + /* We're about to append data to out.queue, so we need to + * atomically test for an external socket owner *and* some other + * thread currently writing. + * + * If we have an external socket owner, we have to get the socket back + * before we can use it again. + * + * If some other thread is writing to the socket, we assume it's + * writing from out.queue, and so we can't stick data there. + * + * We satisfy this condition by first calling get_socket_back + * (which may drop the lock, but will return when XCB owns the + * socket again) and then checking for another writing thread and + * escaping the loop if we're ready to go. + */ + for (;;) { + if(c->has_error) + return; + get_socket_back(c); + if (!c->out.writing) + break; + pthread_cond_wait(&c->out.cond, &c->iolock); + } +} + /* Public interface */ void xcb_prefetch_maximum_request_length(xcb_connection_t *c) @@ -236,24 +263,23 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect /* get a sequence number and arrange for delivery. */ pthread_mutex_lock(&c->iolock); - /* wait for other writing threads to get out of my way. */ - while(c->out.writing) - pthread_cond_wait(&c->out.cond, &c->iolock); - get_socket_back(c); + + prepare_socket_request(c); /* send GetInputFocus (sync_req) when 64k-2 requests have been sent without - * a reply. */ - if(req->isvoid && c->out.request == c->in.request_expected + (1 << 16) - 2) - send_sync(c); - /* Also send sync_req (could use NoOp) at 32-bit wrap to avoid having + * a reply. + * 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 */ - if((unsigned int) (c->out.request + 1) == 0) + * an error in sending the request + */ + + while ((req->isvoid && c->out.request == c->in.request_expected + (1 << 16) - 2) || + (unsigned int) (c->out.request + 1) == 0) + { send_sync(c); + prepare_socket_request(c); + } - /* The above send_sync calls could drop the I/O lock, but this - * thread will still exclude any other thread that tries to write, - * so the sequence number postconditions still hold. */ send_request(c, req->isvoid, workaround, flags, vector, veclen); request = c->has_error ? 0 : c->out.request; pthread_mutex_unlock(&c->iolock); @@ -373,10 +399,7 @@ int _xcb_out_send(xcb_connection_t *c, struct iovec *vector, int count) void _xcb_out_send_sync(xcb_connection_t *c) { - /* wait for other writing threads to get out of my way. */ - while(c->out.writing) - pthread_cond_wait(&c->out.cond, &c->iolock); - get_socket_back(c); + prepare_socket_request(c); send_sync(c); } diff --git a/libxcb/src/xcb_util.c b/libxcb/src/xcb_util.c index 1625742b1..f8d381d3b 100644 --- a/libxcb/src/xcb_util.c +++ b/libxcb/src/xcb_util.c @@ -438,16 +438,17 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, if(!parsed) { c = _xcb_conn_ret_error(XCB_CONN_CLOSED_PARSE_ERR); goto out; - } else { + } + #ifdef _WIN32 - WSADATA wsaData; - if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { - c = _xcb_conn_ret_error(XCB_CONN_ERROR); - goto out; - } -#endif - fd = _xcb_open(host, protocol, display); + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + c = _xcb_conn_ret_error(XCB_CONN_ERROR); + goto out; } +#endif + + fd = _xcb_open(host, protocol, display); if(fd == -1) { c = _xcb_conn_ret_error(XCB_CONN_ERROR); diff --git a/libxcb/xcb-proto/src/dri2.xml b/libxcb/xcb-proto/src/dri2.xml index 0160c6ba8..20d664912 100644 --- a/libxcb/xcb-proto/src/dri2.xml +++ b/libxcb/xcb-proto/src/dri2.xml @@ -98,7 +98,7 @@ authorization from the authors. driver_name_length - 3 + 3 3 diff --git a/libxcb/xcb-proto/src/xf86vidmode.xml b/libxcb/xcb-proto/src/xf86vidmode.xml index 9dacaef41..a165c11d9 100644 --- a/libxcb/xcb-proto/src/xf86vidmode.xml +++ b/libxcb/xcb-proto/src/xf86vidmode.xml @@ -159,7 +159,7 @@ authorization from the authors. vendor_length - 3 + 3 3 diff --git a/libxcb/xcb-proto/src/xinput.xml b/libxcb/xcb-proto/src/xinput.xml index fa115bdcd..924c003c7 100644 --- a/libxcb/xcb-proto/src/xinput.xml +++ b/libxcb/xcb-proto/src/xinput.xml @@ -1000,7 +1000,7 @@ authorization from the authors. - 8 + 8 16 32 diff --git a/libxcb/xcb-proto/src/xprint.xml b/libxcb/xcb-proto/src/xprint.xml index ffd8df1ea..e32293f3b 100644 --- a/libxcb/xcb-proto/src/xprint.xml +++ b/libxcb/xcb-proto/src/xprint.xml @@ -235,7 +235,9 @@ authorization from the authors. - + + stringLen + -- cgit v1.2.3