mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 08:07:10 +02:00
MINOR: stream_interface: Avoid calling si_cs_send/recv if not needed.
Don't bother calling si_cs_send and si_cs_recv if we're either already subscribe, or if the output buffer is empty for si_cs_send.
This commit is contained in:
parent
627505d36a
commit
31f04e4416
24
src/stream.c
24
src/stream.c
@ -1670,12 +1670,20 @@ struct task *process_stream(struct task *t, void *context, unsigned short state)
|
||||
/* First, attempd to do I/Os */
|
||||
cs = objt_cs(si_f->end);
|
||||
if (cs) {
|
||||
si_cs_send(cs);
|
||||
si_cs_recv(cs);
|
||||
if (!(si_f->wait_event.wait_reason & SUB_CAN_SEND) &&
|
||||
co_data(si_oc(si_f)))
|
||||
si_cs_send(cs);
|
||||
if (!(si_f->wait_event.wait_reason & SUB_CAN_RECV) &&
|
||||
!(si_f->flags & SI_FL_WAIT_ROOM))
|
||||
si_cs_recv(cs);
|
||||
}
|
||||
cs = objt_cs(si_b->end);
|
||||
if (cs) {
|
||||
si_cs_send(cs);
|
||||
if (!(si_b->wait_event.wait_reason & SUB_CAN_SEND) &&
|
||||
co_data(si_oc(si_b)))
|
||||
si_cs_send(cs);
|
||||
if (!(si_b->wait_event.wait_reason & SUB_CAN_RECV) &&
|
||||
!(si_b->flags & SI_FL_WAIT_ROOM))
|
||||
si_cs_recv(cs);
|
||||
}
|
||||
redo:
|
||||
@ -2447,11 +2455,17 @@ struct task *process_stream(struct task *t, void *context, unsigned short state)
|
||||
cs = objt_cs(si_f->end);
|
||||
ret = 0;
|
||||
if (cs && !(cs->conn->flags & CO_FL_ERROR) &&
|
||||
!(cs->flags & CS_FL_ERROR) && !(si_oc(si_f)->flags & CF_SHUTW))
|
||||
!(cs->flags & CS_FL_ERROR) &&
|
||||
!(si_oc(si_f)->flags & CF_SHUTW) &&
|
||||
!(si_f->wait_event.wait_reason & SUB_CAN_SEND) &&
|
||||
co_data(si_oc(si_f)))
|
||||
ret = si_cs_send(cs);
|
||||
cs = objt_cs(si_b->end);
|
||||
if (cs && !(cs->conn->flags & CO_FL_ERROR) &&
|
||||
!(cs->flags & CS_FL_ERROR) && !(si_oc(si_b)->flags & CF_SHUTW))
|
||||
!(cs->flags & CS_FL_ERROR) &&
|
||||
!(si_oc(si_b)->flags & CF_SHUTW) &&
|
||||
!(si_b->wait_event.wait_reason & SUB_CAN_SEND) &&
|
||||
co_data(si_oc(si_b)))
|
||||
ret |= si_cs_send(cs);
|
||||
|
||||
if (ret)
|
||||
|
@ -726,7 +726,7 @@ struct task *si_cs_io_cb(struct task *t, void *ctx, unsigned short state)
|
||||
if (!cs)
|
||||
return NULL;
|
||||
redo:
|
||||
if (!(si->wait_event.wait_reason & SUB_CAN_SEND))
|
||||
if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si)))
|
||||
ret = si_cs_send(cs);
|
||||
if (!(si->wait_event.wait_reason & SUB_CAN_RECV))
|
||||
ret |= si_cs_recv(cs);
|
||||
@ -978,7 +978,8 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
|
||||
!(si->flags & SI_FL_WAIT_DATA)) /* not waiting for data */
|
||||
return;
|
||||
|
||||
si_cs_send(cs);
|
||||
if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si)))
|
||||
si_cs_send(cs);
|
||||
tasklet_wakeup(si->wait_event.task);
|
||||
if (cs->flags & CS_FL_ERROR || cs->conn->flags & CO_FL_ERROR) {
|
||||
/* Write error on the file descriptor */
|
||||
|
Loading…
Reference in New Issue
Block a user