summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-12-01 10:28:51 +0000
committerJulien Danjou <julien@danjou.info>2012-01-11 17:49:02 +0100
commit9b4d6f30a339e2d18ebaea98149da81aba453216 (patch)
treea0132ae75d48a994b6e9de513786a60932d1ef0b
parent5ceeaaa4294201b3f613c07f9ec610c0e5f673c7 (diff)
Make xcb_take_socket keep flushing until idle
_xcb_out_flush_to will drop the iolock in pthread_cond_wait allowing other threads to queue new requests. When this happened, there would be requests queued for the socket after _xcb_out_flush_to returned, and xcb_take_socket would throw an assert. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29875 Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Julien Danjou <julien@danjou.info>
-rw-r--r--src/xcb_out.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/xcb_out.c b/src/xcb_out.c
index 5eb1e42..d6082fc 100644
--- a/src/xcb_out.c
+++ b/src/xcb_out.c
@@ -263,7 +263,13 @@ int xcb_take_socket(xcb_connection_t *c, void (*return_socket)(void *closure), v
return 0;
pthread_mutex_lock(&c->iolock);
get_socket_back(c);
- ret = _xcb_out_flush_to(c, c->out.request);
+
+ /* _xcb_out_flush may drop the iolock allowing other threads to
+ * write requests, so keep flushing until we're done
+ */
+ do
+ ret = _xcb_out_flush_to(c, c->out.request);
+ while (ret && c->out.request != c->out.request_written);
if(ret)
{
c->out.return_socket = return_socket;