mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 06:11:32 +02:00
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.
This commit is contained in:
parent
5d18718c8f
commit
e1c6dbcd70
@ -601,6 +601,7 @@ static inline void cs_init(struct conn_stream *cs, struct connection *conn)
|
|||||||
LIST_INIT(&cs->wait_list.list);
|
LIST_INIT(&cs->wait_list.list);
|
||||||
LIST_INIT(&cs->send_wait_list);
|
LIST_INIT(&cs->send_wait_list);
|
||||||
cs->conn = conn;
|
cs->conn = conn;
|
||||||
|
cs->wait_list.wait_reason = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initializes all required fields for a new connection. Note that it does the
|
/* Initializes all required fields for a new connection. Note that it does the
|
||||||
|
@ -44,9 +44,15 @@ struct buffer;
|
|||||||
struct server;
|
struct server;
|
||||||
struct pipe;
|
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 wait_list {
|
||||||
struct tasklet *task;
|
struct tasklet *task;
|
||||||
struct list list;
|
struct list list;
|
||||||
|
int wait_reason;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A connection handle is how we differenciate two connections on the lower
|
/* A connection handle is how we differenciate two connections on the lower
|
||||||
@ -90,9 +96,6 @@ enum cs_shw_mode {
|
|||||||
CS_SHW_SILENT = 1, /* imminent close, don't notify peer */
|
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
|
/* 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
|
* 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
|
* layers. The current status corresponding to the current layer being used is
|
||||||
|
@ -134,6 +134,7 @@ void conn_fd_handler(int fd)
|
|||||||
struct wait_list *, list);
|
struct wait_list *, list);
|
||||||
LIST_DEL(&sw->list);
|
LIST_DEL(&sw->list);
|
||||||
LIST_INIT(&sw->list);
|
LIST_INIT(&sw->list);
|
||||||
|
sw->wait_reason &= ~SUB_CAN_SEND;
|
||||||
tasklet_wakeup(sw->task);
|
tasklet_wakeup(sw->task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -338,8 +339,10 @@ int conn_subscribe(struct connection *conn, int event_type, void *param)
|
|||||||
switch (event_type) {
|
switch (event_type) {
|
||||||
case SUB_CAN_SEND:
|
case SUB_CAN_SEND:
|
||||||
sw = param;
|
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);
|
LIST_ADDQ(&conn->send_wait_list, &sw->list);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -369,6 +369,7 @@ static int h2c_frt_init(struct connection *conn)
|
|||||||
goto fail;
|
goto fail;
|
||||||
h2c->wait_list.task->process = h2_send;
|
h2c->wait_list.task->process = h2_send;
|
||||||
h2c->wait_list.task->context = conn;
|
h2c->wait_list.task->context = conn;
|
||||||
|
h2c->wait_list.wait_reason = 0;
|
||||||
|
|
||||||
h2c->ddht = hpack_dht_alloc(h2_settings_header_table_size);
|
h2c->ddht = hpack_dht_alloc(h2_settings_header_table_size);
|
||||||
if (!h2c->ddht)
|
if (!h2c->ddht)
|
||||||
@ -2289,6 +2290,7 @@ static struct task *h2_send(struct task *t, void *ctx, unsigned short state)
|
|||||||
struct wait_list *, list);
|
struct wait_list *, list);
|
||||||
LIST_DEL(&sw->list);
|
LIST_DEL(&sw->list);
|
||||||
LIST_INIT(&sw->list);
|
LIST_INIT(&sw->list);
|
||||||
|
sw->wait_reason &= ~SUB_CAN_SEND;
|
||||||
tasklet_wakeup(sw->task);
|
tasklet_wakeup(sw->task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3409,8 +3411,11 @@ static int h2_subscribe(struct conn_stream *cs, int event_type, void *param)
|
|||||||
switch (event_type) {
|
switch (event_type) {
|
||||||
case SUB_CAN_SEND:
|
case SUB_CAN_SEND:
|
||||||
sw = param;
|
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);
|
LIST_ADDQ(&h2s->h2c->send_wait_list, &sw->list);
|
||||||
|
sw->wait_reason |= SUB_CAN_SEND;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -652,7 +652,7 @@ static struct task * si_cs_send(struct task *t, void *ctx, unsigned short state)
|
|||||||
int did_send = 0;
|
int did_send = 0;
|
||||||
|
|
||||||
/* We're already waiting to be able to send, give up */
|
/* 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;
|
return NULL;
|
||||||
|
|
||||||
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)
|
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)
|
||||||
@ -661,7 +661,7 @@ static struct task * si_cs_send(struct task *t, void *ctx, unsigned short state)
|
|||||||
if (conn->flags & CO_FL_HANDSHAKE) {
|
if (conn->flags & CO_FL_HANDSHAKE) {
|
||||||
/* a handshake was requested */
|
/* a handshake was requested */
|
||||||
/* Schedule ourself to be woken up once the handshake is done */
|
/* 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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,6 +751,7 @@ wake_others:
|
|||||||
struct wait_list *, list);
|
struct wait_list *, list);
|
||||||
LIST_DEL(&sw->list);
|
LIST_DEL(&sw->list);
|
||||||
LIST_INIT(&sw->list);
|
LIST_INIT(&sw->list);
|
||||||
|
sw->wait_reason &= ~SUB_CAN_SEND;
|
||||||
tasklet_wakeup(sw->task);
|
tasklet_wakeup(sw->task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user