Remove c->out.vec. Pass iovecs directly down the call tree. Add _xcb_out_flush_to...
[free-sw/xcb/libxcb] / src / xcb_in.c
index cf7dbe7..89b06ab 100644 (file)
@@ -91,6 +91,8 @@ static int read_packet(XCBConnection *c)
         c->in.request_read = (lastread & 0xffff0000) | genrep.sequence;
         if(c->in.request_read < lastread)
             c->in.request_read += 0x10000;
+        if(c->in.request_read > c->in.request_expected)
+            c->in.request_expected = c->in.request_read;
 
         if(c->in.request_read != lastread)
         {
@@ -141,6 +143,11 @@ static int read_packet(XCBConnection *c)
         free(buf);
         return 0;
     }
+    if(pend && (pend->flags & XCB_REQUEST_DISCARD_REPLY))
+    {
+        free(buf);
+        return 1;
+    }
 
     if(genrep.response_type != 1)
         ((XCBGenericEvent *) buf)->full_sequence = c->in.request_read;
@@ -238,12 +245,15 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **
     if(e)
         *e = 0;
 
+    /* If an error occurred when issuing the request, fail immediately. */
+    if(!request)
+        return 0;
+
     pthread_mutex_lock(&c->iolock);
 
     /* If this request has not been written yet, write it. */
-    if((signed int) (c->out.request_written - request) < 0)
-        if(!_xcb_out_flush(c))
-            goto done; /* error */
+    if(!_xcb_out_flush_to(c, request))
+        goto done; /* error */
 
     for(prev_reader = &c->in.readers; *prev_reader && (*prev_reader)->request <= request; prev_reader = &(*prev_reader)->next)
         if((*prev_reader)->request == request)
@@ -258,7 +268,7 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **
      * wait for one. */
     while(c->in.request_completed < request &&
             !(c->in.request_read == request && c->in.current_reply))
-        if(!_xcb_conn_wait(c, /*should_write*/ 0, &cond))
+        if(!_xcb_conn_wait(c, &cond, 0, 0))
             goto done;
 
     if(c->in.request_read != request)
@@ -318,7 +328,7 @@ XCBGenericEvent *XCBWaitForEvent(XCBConnection *c)
     pthread_mutex_lock(&c->iolock);
     /* get_event returns 0 on empty list. */
     while(!(ret = get_event(c)))
-        if(!_xcb_conn_wait(c, /*should_write*/ 0, &c->in.event_cond))
+        if(!_xcb_conn_wait(c, &c->in.event_cond, 0, 0))
             break;
 
     wake_up_next_reader(c);