{
cs->obj_type = OBJ_TYPE_CS;
cs->flags = CS_FL_NONE;
- LIST_INIT(&cs->wait_list.list);
- LIST_INIT(&cs->send_wait_list);
- LIST_INIT(&cs->recv_wait_list);
- LIST_INIT(&cs->sendrecv_wait_list);
cs->conn = conn;
- cs->wait_list.wait_reason = 0;
}
/* Initializes all required fields for a new connection. Note that it does the
*/
static inline void cs_free(struct conn_stream *cs)
{
- if (cs->wait_list.task)
- tasklet_free(cs->wait_list.task);
pool_free(pool_head_connstream, cs);
}
if (!likely(cs))
return NULL;
- cs->wait_list.task = tasklet_new();
- if (!likely(cs->wait_list.task)) {
- cs_free(cs);
- return NULL;
- }
if (!conn) {
conn = conn_new();
if (!likely(conn)) {
/* 3 bytes hole here */
unsigned int flags; /* CS_FL_* */
struct connection *conn; /* xprt-level connection */
- struct wait_list wait_list; /* We're in a wait list for send */
- struct list send_wait_list; /* list of tasks to wake when we're ready to send */
- struct list recv_wait_list; /* list of tasks to wake when we're ready to recv */
- struct list sendrecv_wait_list; /* list of tasks to wake when we're ready to either send or recv */
void *data; /* pointer to upper layer's entity (eg: stream interface) */
const struct data_cb *data_cb; /* data layer callbacks. Must be set before xprt->init() */
void *ctx; /* mux-specific context */
* in the normal buffer.
*/
if (!co_data(oc))
- goto wake_others;
+ return did_send;
/* when we're here, we already know that there is no spliced
* data left, and that there are sendable buffered data.
cs_want_send(cs);
conn->mux->subscribe(cs, SUB_CAN_SEND, &si->wait_list);
}
-
-wake_others:
- /* Maybe somebody was waiting for this conn_stream, wake them */
- if (did_send) {
- while (!LIST_ISEMPTY(&cs->send_wait_list)) {
- struct wait_list *sw = LIST_ELEM(cs->send_wait_list.n,
- struct wait_list *, list);
- LIST_DEL(&sw->list);
- LIST_INIT(&sw->list);
- sw->wait_reason &= ~SUB_CAN_SEND;
- tasklet_wakeup(sw->task);
- }
- while (!(LIST_ISEMPTY(&cs->sendrecv_wait_list))) {
- struct wait_list *sw = LIST_ELEM(cs->sendrecv_wait_list.n,
- struct wait_list *, list);
- LIST_DEL(&sw->list);
- LIST_INIT(&sw->list);
- LIST_ADDQ(&cs->recv_wait_list, &sw->list);
- sw->wait_reason &= ~SUB_CAN_SEND;
- tasklet_wakeup(sw->task);
- }
-
- }
return did_send;
}
}
ic->last_read = now_ms;
}
- if (cur_read > 0) {
- while (!LIST_ISEMPTY(&cs->recv_wait_list)) {
- struct wait_list *sw = LIST_ELEM(cs->recv_wait_list.n,
- struct wait_list *, list);
- LIST_DEL(&sw->list);
- LIST_INIT(&sw->list);
- sw->wait_reason &= ~SUB_CAN_RECV;
- tasklet_wakeup(sw->task);
- }
- while (!(LIST_ISEMPTY(&cs->sendrecv_wait_list))) {
- struct wait_list *sw = LIST_ELEM(cs->sendrecv_wait_list.n,
- struct wait_list *, list);
- LIST_DEL(&sw->list);
- LIST_INIT(&sw->list);
- LIST_ADDQ(&cs->send_wait_list, &sw->list);
- sw->wait_reason &= ~SUB_CAN_RECV;
- tasklet_wakeup(sw->task);
- }
-
- }
end_recv:
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)