[Xcb-commit] src

Julien Danjou jdanjou at kemper.freedesktop.org
Wed Jan 11 08:49:10 PST 2012


 src/xcb_out.c |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

New commits:
commit 9b4d6f30a339e2d18ebaea98149da81aba453216
Author: Keith Packard <keithp at keithp.com>
Date:   Thu Dec 1 10:28:51 2011 +0000

    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 at keithp.com>
    Signed-off-by: Julien Danjou <julien at danjou.info>

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;


More information about the xcb-commit mailing list