diff --git a/include/proto/session.h b/include/proto/session.h index fd62dfdbf..2dc3d830e 100644 --- a/include/proto/session.h +++ b/include/proto/session.h @@ -60,7 +60,7 @@ void __session_offer_buffers(int rqlimit); static inline void session_offer_buffers(); int session_alloc_work_buffer(struct session *s); void session_release_buffers(struct session *s); -int session_alloc_recv_buffer(struct session *s, struct buffer **buf); +int session_alloc_recv_buffer(struct channel *chn); /* sets the stick counter's entry pointer */ static inline void stkctr_set_entry(struct stkctr *stkctr, struct stksess *entry) diff --git a/src/hlua.c b/src/hlua.c index 78f67731f..02e3e31e9 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1440,7 +1440,7 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext * the request buffer if its not required. */ if (socket->s->req.buf->size == 0) { - if (!session_alloc_recv_buffer(socket->s, &socket->s->req.buf)) { + if (!session_alloc_recv_buffer(&socket->s->req)) { socket->s->si[0].flags |= SI_FL_WAIT_ROOM; goto hlua_socket_write_yield_return; } @@ -2324,7 +2324,7 @@ __LJMP static int hlua_channel_send_yield(lua_State *L, int status, lua_KContext * the request buffer if its not required. */ if (chn->chn->buf->size == 0) { - if (!session_alloc_recv_buffer(chn->s, &chn->chn->buf)) { + if (!session_alloc_recv_buffer(chn->chn)) { chn_prod(chn->chn)->flags |= SI_FL_WAIT_ROOM; WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_channel_send_yield, TICK_ETERNITY, 0)); } diff --git a/src/session.c b/src/session.c index 26758477f..94fc875b0 100644 --- a/src/session.c +++ b/src/session.c @@ -670,24 +670,26 @@ static void session_free(struct session *s) } } -/* Allocates a single buffer for session , but only if it's guaranteed that - * it's not the last available buffer. To be called at the beginning of recv() - * callbacks to ensure that the required buffers are properly allocated. If the - * buffer is the session's request buffer, an extra control is made so that we - * always keep buffers available after this allocation. - * In all circumstances we leave at least 2 buffers so that any later call from - * process_session() has a chance to succeed. The response buffer is not bound - * to this control. Returns 0 in case of failure, non-zero otherwise. +/* Allocates a receive buffer for channel , but only if it's guaranteed + * that it's not the last available buffer or it's the response buffer. Unless + * the buffer is the response buffer, an extra control is made so that we always + * keep buffers available after this allocation. To be + * called at the beginning of recv() callbacks to ensure that the required + * buffers are properly allocated. Returns 0 in case of failure, non-zero + * otherwise. */ -int session_alloc_recv_buffer(struct session *s, struct buffer **buf) +int session_alloc_recv_buffer(struct channel *chn) { + struct session *s; struct buffer *b; int margin = 0; - if (buf == &s->req.buf) + if (!(chn->flags & CF_ISRESP)) margin = global.tune.reserved_bufs; - b = b_alloc_margin(buf, margin); + s = chn_sess(chn); + + b = b_alloc_margin(&chn->buf, margin); if (b) return 1; diff --git a/src/stream_interface.c b/src/stream_interface.c index 9912df074..1ba509e75 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -1185,7 +1185,7 @@ static void si_conn_recv_cb(struct connection *conn) } /* now we'll need a buffer */ - if (!session_alloc_recv_buffer(si_sess(si), &ic->buf)) { + if (!session_alloc_recv_buffer(ic)) { si->flags |= SI_FL_WAIT_ROOM; goto end_recv; }