diff options
Diffstat (limited to 'libxcb')
-rw-r--r-- | libxcb/src/xcb_out.c | 57 | ||||
-rw-r--r-- | libxcb/src/xcb_util.c | 17 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/dri2.xml | 2 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xf86vidmode.xml | 2 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xinput.xml | 2 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xprint.xml | 4 |
6 files changed, 55 insertions, 29 deletions
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. <op op="&"> <op op="+"> <fieldref>driver_name_length</fieldref> - <value> 3 </value> + <value>3</value> </op> <unop op="~"> <value>3</value> 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. <op op="&"> <op op="+"> <fieldref>vendor_length</fieldref> - <value> 3 </value> + <value>3</value> </op> <unop op="~"> <value>3</value> 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. <!-- ChangeDeviceProperty --> <enum name="PropertyFormat"> - <item name="8Bits"> <value> 8</value> </item> + <item name="8Bits"> <value>8</value> </item> <item name="16Bits"> <value>16</value> </item> <item name="32Bits"> <value>32</value> </item> </enum> 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. <pad bytes="1" /> <field type="CARD32" name="stringLen" /> <pad bytes="20" /> - <field type="STRING8" name="attributes" /> + <list type="STRING8" name="attributes"> + <fieldref>stringLen</fieldref> + </list> </reply> </request> |