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.
diff --git a/src/stream.c b/src/stream.c
index 200556f..8df5c75 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1670,12 +1670,20 @@
/* 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 @@
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)
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 8057d27..04eedf2 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -726,7 +726,7 @@
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 @@
!(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 */