diff options
author | Jamey Sharp <jamey@minilop.net> | 2008-03-14 20:18:52 -0700 |
---|---|---|
committer | Jamey Sharp <jamey@minilop.net> | 2008-10-29 15:40:41 -0700 |
commit | 96e55444b9b9500420f9132a1ace720100a26398 (patch) | |
tree | baaf722e5b4b0295034932eecd78408984352395 | |
parent | 059ca642c76639fee958dc6054070de85e257e98 (diff) |
Use sequence number ranges in pending replies
This allows optimizing adjacent pending replies with the same flags, and
will help support default flags for a range of future requests.
Commit by Josh Triplett and Jamey Sharp.
-rw-r--r-- | src/xcb_in.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/xcb_in.c b/src/xcb_in.c index a0e5e10..0c68208 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -52,7 +52,8 @@ struct reply_list { }; typedef struct pending_reply { - unsigned int request; + unsigned int first_request; + unsigned int last_request; enum workarounds workaround; int flags; struct pending_reply *next; @@ -112,7 +113,7 @@ static int read_packet(xcb_connection_t *c) } while(c->in.pending_replies && - XCB_SEQUENCE_COMPARE (c->in.pending_replies->request, <=, c->in.request_completed)) + XCB_SEQUENCE_COMPARE (c->in.pending_replies->last_request, <=, c->in.request_completed)) { pending_reply *oldpend = c->in.pending_replies; c->in.pending_replies = oldpend->next; @@ -128,7 +129,9 @@ static int read_packet(xcb_connection_t *c) if(genrep.response_type == XCB_ERROR || genrep.response_type == XCB_REPLY) { pend = c->in.pending_replies; - if(pend && pend->request != c->in.request_read) + if(pend && + (XCB_SEQUENCE_COMPARE(c->in.request_read, <, pend->first_request) || + XCB_SEQUENCE_COMPARE(c->in.request_read, >, pend->last_request))) pend = 0; } @@ -506,7 +509,7 @@ int _xcb_in_expect_reply(xcb_connection_t *c, unsigned int request, enum workaro _xcb_conn_shutdown(c); return 0; } - pend->request = request; + pend->first_request = pend->last_request = request; pend->workaround = workaround; pend->flags = flags; pend->next = 0; |