Replace pending_replies generic queue with a hand-implemented typesafe version.
This commit is contained in:
parent
a1eff0c49a
commit
7875040fa1
31
src/xcb_in.c
31
src/xcb_in.c
|
@ -36,9 +36,10 @@
|
||||||
#include "xcbext.h"
|
#include "xcbext.h"
|
||||||
#include "xcbint.h"
|
#include "xcbint.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct pending_reply {
|
||||||
unsigned int request;
|
unsigned int request;
|
||||||
enum workarounds workaround;
|
enum workarounds workaround;
|
||||||
|
struct pending_reply *next;
|
||||||
} pending_reply;
|
} pending_reply;
|
||||||
|
|
||||||
typedef struct XCBReplyData {
|
typedef struct XCBReplyData {
|
||||||
|
@ -99,7 +100,7 @@ static int read_packet(XCBConnection *c)
|
||||||
/* For reply packets, check that the entire packet is available. */
|
/* For reply packets, check that the entire packet is available. */
|
||||||
if(genrep.response_type == 1)
|
if(genrep.response_type == 1)
|
||||||
{
|
{
|
||||||
pending_reply *pend = _xcb_list_peek_head(c->in.pending_replies);
|
pending_reply *pend = c->in.pending_replies;
|
||||||
if(pend && pend->request == c->in.request_read)
|
if(pend && pend->request == c->in.request_read)
|
||||||
{
|
{
|
||||||
switch(pend->workaround)
|
switch(pend->workaround)
|
||||||
|
@ -113,7 +114,10 @@ static int read_packet(XCBConnection *c)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
free(_xcb_queue_dequeue(c->in.pending_replies));
|
c->in.pending_replies = pend->next;
|
||||||
|
if(!pend->next)
|
||||||
|
c->in.pending_replies_tail = &c->in.pending_replies;
|
||||||
|
free(pend);
|
||||||
}
|
}
|
||||||
length += genrep.length * 4;
|
length += genrep.length * 4;
|
||||||
}
|
}
|
||||||
|
@ -301,11 +305,11 @@ int _xcb_in_init(_xcb_in *in)
|
||||||
in->replies = _xcb_map_new();
|
in->replies = _xcb_map_new();
|
||||||
in->events = _xcb_queue_new();
|
in->events = _xcb_queue_new();
|
||||||
in->readers = _xcb_list_new();
|
in->readers = _xcb_list_new();
|
||||||
|
if(!in->current_reply || !in->replies || !in->events || !in->readers)
|
||||||
in->pending_replies = _xcb_queue_new();
|
|
||||||
if(!in->current_reply || !in->replies || !in->events || !in->readers || !in->pending_replies)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
in->pending_replies_tail = &in->pending_replies;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,7 +320,12 @@ void _xcb_in_destroy(_xcb_in *in)
|
||||||
_xcb_map_delete(in->replies, free);
|
_xcb_map_delete(in->replies, free);
|
||||||
_xcb_queue_delete(in->events, free);
|
_xcb_queue_delete(in->events, free);
|
||||||
_xcb_list_delete(in->readers, 0);
|
_xcb_list_delete(in->readers, 0);
|
||||||
_xcb_queue_delete(in->pending_replies, free);
|
while(in->pending_replies)
|
||||||
|
{
|
||||||
|
pending_reply *pend = in->pending_replies;
|
||||||
|
in->pending_replies = pend->next;
|
||||||
|
free(pend);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workarounds workaround)
|
int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workarounds workaround)
|
||||||
|
@ -328,11 +337,9 @@ int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workaround
|
||||||
return 0;
|
return 0;
|
||||||
pend->request = request;
|
pend->request = request;
|
||||||
pend->workaround = workaround;
|
pend->workaround = workaround;
|
||||||
if(!_xcb_queue_enqueue(c->in.pending_replies, pend))
|
pend->next = 0;
|
||||||
{
|
*c->in.pending_replies_tail = pend;
|
||||||
free(pend);
|
c->in.pending_replies_tail = &pend->next;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,8 @@ typedef struct _xcb_in {
|
||||||
_xcb_queue *events;
|
_xcb_queue *events;
|
||||||
_xcb_list *readers;
|
_xcb_list *readers;
|
||||||
|
|
||||||
_xcb_queue *pending_replies;
|
struct pending_reply *pending_replies;
|
||||||
|
struct pending_reply **pending_replies_tail;
|
||||||
} _xcb_in;
|
} _xcb_in;
|
||||||
|
|
||||||
int _xcb_in_init(_xcb_in *in);
|
int _xcb_in_init(_xcb_in *in);
|
||||||
|
|
Loading…
Reference in New Issue