MINOR: connections/mux: Add the wait reason(s) to wait_list.
Add a new element to the wait_list, that let us know which event(s) we are
waiting on.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index e4621cc..35b9dfe 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -601,6 +601,7 @@
LIST_INIT(&cs->wait_list.list);
LIST_INIT(&cs->send_wait_list);
cs->conn = conn;
+ cs->wait_list.wait_reason = 0;
}
/* Initializes all required fields for a new connection. Note that it does the
diff --git a/include/types/connection.h b/include/types/connection.h
index abe85a4..9a1ba96 100644
--- a/include/types/connection.h
+++ b/include/types/connection.h
@@ -44,9 +44,15 @@
struct server;
struct pipe;
+enum sub_event_type {
+ SUB_CAN_SEND = 0x00000001, /* Schedule the tasklet when we can send more */
+ SUB_CAN_RECV = 0x00000002, /* Schedule the tasklet when we can recv more */
+};
+
struct wait_list {
struct tasklet *task;
struct list list;
+ int wait_reason;
};
/* A connection handle is how we differenciate two connections on the lower
@@ -90,9 +96,6 @@
CS_SHW_SILENT = 1, /* imminent close, don't notify peer */
};
-enum sub_event_type {
- SUB_CAN_SEND = 0x00000001, /* Schedule the tasklet when we can send more */
-};
/* For each direction, we have a CO_FL_{SOCK,DATA}_<DIR>_ENA flag, which
* indicates if read or write is desired in that direction for the respective
* layers. The current status corresponding to the current layer being used is
diff --git a/src/connection.c b/src/connection.c
index df3df84..ee80e61 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -134,6 +134,7 @@
struct wait_list *, list);
LIST_DEL(&sw->list);
LIST_INIT(&sw->list);
+ sw->wait_reason &= ~SUB_CAN_SEND;
tasklet_wakeup(sw->task);
}
}
@@ -338,8 +339,10 @@
switch (event_type) {
case SUB_CAN_SEND:
sw = param;
- if (LIST_ISEMPTY(&sw->list))
+ if (!(sw->wait_reason & SUB_CAN_SEND)) {
+ sw->wait_reason |= SUB_CAN_SEND;
LIST_ADDQ(&conn->send_wait_list, &sw->list);
+ }
return 0;
default:
break;
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 0ad4bac..538d21f 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -369,6 +369,7 @@
goto fail;
h2c->wait_list.task->process = h2_send;
h2c->wait_list.task->context = conn;
+ h2c->wait_list.wait_reason = 0;
h2c->ddht = hpack_dht_alloc(h2_settings_header_table_size);
if (!h2c->ddht)
@@ -2289,6 +2290,7 @@
struct wait_list *, list);
LIST_DEL(&sw->list);
LIST_INIT(&sw->list);
+ sw->wait_reason &= ~SUB_CAN_SEND;
tasklet_wakeup(sw->task);
}
@@ -3409,8 +3411,11 @@
switch (event_type) {
case SUB_CAN_SEND:
sw = param;
- if (LIST_ISEMPTY(&h2s->list) && LIST_ISEMPTY(&sw->list))
+ if (LIST_ISEMPTY(&h2s->list) &&
+ !(sw->wait_reason & SUB_CAN_SEND)) {
LIST_ADDQ(&h2s->h2c->send_wait_list, &sw->list);
+ sw->wait_reason |= SUB_CAN_SEND;
+ }
return 0;
default:
break;
diff --git a/src/stream_interface.c b/src/stream_interface.c
index f2d6b6f..92b8e85 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -652,7 +652,7 @@
int did_send = 0;
/* We're already waiting to be able to send, give up */
- if (!LIST_ISEMPTY(&cs->wait_list.list))
+ if (cs->wait_list.wait_reason & SUB_CAN_SEND)
return NULL;
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)
@@ -661,7 +661,7 @@
if (conn->flags & CO_FL_HANDSHAKE) {
/* a handshake was requested */
/* Schedule ourself to be woken up once the handshake is done */
- LIST_ADDQ(&conn->send_wait_list, &cs->wait_list.list);
+ conn->xprt->subscribe(conn, SUB_CAN_SEND, wl_set_waitcb(&cs->wait_list, si_cs_send, ctx));
return NULL;
}
@@ -751,6 +751,7 @@
struct wait_list *, list);
LIST_DEL(&sw->list);
LIST_INIT(&sw->list);
+ sw->wait_reason &= ~SUB_CAN_SEND;
tasklet_wakeup(sw->task);
}
}