Track 64-bit sequence numbers internally.
[free-sw/xcb/libxcb] / src / xcb_out.c
index 60226e5..1094ceb 100644 (file)
@@ -111,8 +111,8 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
             uint16_t len;
         } fields;
         uint32_t packet;
-    } sync = { { /* GetInputFocus */ 43, 0, 1 } };
-    unsigned int request;
+    } sync_req = { { /* GetInputFocus */ 43, 0, 1 } };
+    uint64_t request;
     uint32_t prefix[3] = { 0 };
     int veclen = req->count;
     enum workarounds workaround = WORKAROUND_NONE;
@@ -127,7 +127,7 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
     if(!(flags & XCB_REQUEST_RAW))
     {
         static const char pad[3];
-        int i;
+        unsigned int i;
         uint16_t shortlen = 0;
         size_t longlen = 0;
         assert(vector[0].iov_len >= 4);
@@ -187,22 +187,22 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
         workaround = WORKAROUND_GLX_GET_FB_CONFIGS_BUG;
 
     /* get a sequence number and arrange for delivery. */
-    _xcb_lock_io(c);
+    pthread_mutex_lock(&c->iolock);
     /* wait for other writing threads to get out of my way. */
     while(c->out.writing)
-        _xcb_wait_io(c, &c->out.cond);
+        pthread_cond_wait(&c->out.cond, &c->iolock);
 
     request = ++c->out.request;
-    /* send GetInputFocus (sync) when 64k-2 requests have been sent without
+    /* send GetInputFocus (sync_req) when 64k-2 requests have been sent without
      * a reply.
-     * Also send sync (could use NoOp) at 32-bit wrap to avoid having
+     * 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 */
     while((req->isvoid &&
        c->out.request == c->in.request_expected + (1 << 16) - 1) ||
        request == 0)
     {
-        prefix[0] = sync.packet;
+        prefix[0] = sync_req.packet;
         _xcb_in_expect_reply(c, request, WORKAROUND_NONE, XCB_REQUEST_DISCARD_REPLY);
         c->in.request_expected = c->out.request;
        request = ++c->out.request;
@@ -231,7 +231,7 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
         _xcb_conn_shutdown(c);
         request = 0;
     }
-    _xcb_unlock_io(c);
+    pthread_mutex_unlock(&c->iolock);
     return request;
 }
 
@@ -240,9 +240,9 @@ int xcb_flush(xcb_connection_t *c)
     int ret;
     if(c->has_error)
         return 0;
-    _xcb_lock_io(c);
+    pthread_mutex_lock(&c->iolock);
     ret = _xcb_out_flush_to(c, c->out.request);
-    _xcb_unlock_io(c);
+    pthread_mutex_unlock(&c->iolock);
     return ret;
 }
 
@@ -282,7 +282,7 @@ int _xcb_out_send(xcb_connection_t *c, struct iovec **vector, int *count)
     return ret;
 }
 
-int _xcb_out_flush_to(xcb_connection_t *c, unsigned int request)
+int _xcb_out_flush_to(xcb_connection_t *c, uint64_t request)
 {
     assert(XCB_SEQUENCE_COMPARE(request, <=, c->out.request));
     if(XCB_SEQUENCE_COMPARE(c->out.request_written, >=, request))
@@ -297,7 +297,7 @@ int _xcb_out_flush_to(xcb_connection_t *c, unsigned int request)
         return _xcb_out_send(c, &vec_ptr, &count);
     }
     while(c->out.writing)
-        _xcb_wait_io(c, &c->out.cond);
+        pthread_cond_wait(&c->out.cond, &c->iolock);
     assert(XCB_SEQUENCE_COMPARE(c->out.request_written, >=, request));
     return 1;
 }