summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2008-03-14 20:18:52 -0700
committerJamey Sharp <jamey@minilop.net>2008-10-29 15:40:41 -0700
commit96e55444b9b9500420f9132a1ace720100a26398 (patch)
treebaaf722e5b4b0295034932eecd78408984352395 /src
parent059ca642c76639fee958dc6054070de85e257e98 (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.
Diffstat (limited to 'src')
-rw-r--r--src/xcb_in.c11
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;