Added seq sort key in ob_pq to preserve the queueing order if priorit is the same.

This commit is contained in:
Tatsuhiro Tsujikawa 2012-01-31 22:48:09 +09:00
parent 4e192493ab
commit 49096387c3
2 changed files with 13 additions and 1 deletions

View File

@ -58,8 +58,12 @@ int spdylay_outbound_item_compar(const void *lhsx, const void *rhsx)
const spdylay_outbound_item *lhs, *rhs;
lhs = (const spdylay_outbound_item*)lhsx;
rhs = (const spdylay_outbound_item*)rhsx;
if(lhs->pri == rhs->pri) {
return (lhs->seq < rhs->seq) ? -1 : ((lhs->seq > rhs->seq) ? 1 : 0);
} else {
return lhs->pri-rhs->pri;
}
}
int spdylay_session_client_new(spdylay_session **session_ptr,
const spdylay_session_callbacks *callbacks,
@ -79,6 +83,8 @@ int spdylay_session_client_new(spdylay_session **session_ptr,
(*session_ptr)->last_ping_unique_id = 0;
(*session_ptr)->next_seq = 0;
(*session_ptr)->goaway_flags = SPDYLAY_GOAWAY_NONE;
(*session_ptr)->last_good_stream_id = 0;
@ -192,6 +198,7 @@ int spdylay_session_add_frame(spdylay_session *session,
item->frame_type = frame_type;
item->frame = frame;
item->aux_data = aux_data;
item->seq = session->next_seq++;
/* Set priority lowest at the moment. */
item->pri = 3;
switch(frame_type) {

View File

@ -41,6 +41,7 @@ typedef struct {
spdylay_frame *frame;
void *aux_data;
int pri;
int64_t seq;
} spdylay_outbound_item;
typedef struct {
@ -94,6 +95,10 @@ struct spdylay_session {
SPDYLAY_MAX_UNIQUE_ID */
uint32_t next_unique_id;
/* Sequence number of outbound frame to maintain the order of
enqueue if priority is equal. */
int64_t next_seq;
spdylay_map /* <spdylay_stream*> */ streams;
spdylay_pq /* <spdylay_outbound_item*> */ ob_pq;