Commit 4133b274 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Push sess out of the stream-polling operation.

parent 9765f1a8
......@@ -722,7 +722,7 @@ int VGZ_Gzip(struct vgz *, const void **, size_t *len, enum vgz_flag);
int VGZ_Gunzip(struct vgz *, const void **, size_t *len);
void VGZ_Destroy(struct vgz **);
void VGZ_UpdateObj(const struct vgz*, struct object *);
int VGZ_WrwGunzip(const struct sess *, struct vgz *, const void *ibuf,
int VGZ_WrwGunzip(struct worker *w, struct vgz *, const void *ibuf,
ssize_t ibufl, char *obuf, ssize_t obufl, ssize_t *obufp);
/* Return values */
......@@ -898,7 +898,7 @@ void RES_BuildHttp(const struct sess *sp);
void RES_WriteObj(struct sess *sp);
void RES_StreamStart(struct sess *sp);
void RES_StreamEnd(struct sess *sp);
void RES_StreamPoll(const struct sess *sp);
void RES_StreamPoll(struct worker *);
/* cache_vary.c */
struct vsb *VRY_Create(const struct sess *sp, const struct http *hp);
......
......@@ -330,7 +330,7 @@ ESI_Deliver(struct sess *sp)
* response
*/
AN(vgz);
i = VGZ_WrwGunzip(sp, vgz,
i = VGZ_WrwGunzip(sp->wrk, vgz,
st->ptr + off, l2,
obuf, sizeof obuf, &obufl);
if (WRW_Error(sp->wrk)) {
......
......@@ -101,7 +101,7 @@ vfp_nop_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes)
sp->obj->len += w;
bytes -= w;
if (sp->wrk->do_stream)
RES_StreamPoll(sp);
RES_StreamPoll(sp->wrk);
}
return (1);
}
......
......@@ -350,7 +350,7 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, size_t *plen, enum vgz_flag flags)
*/
int
VGZ_WrwGunzip(const struct sess *sp, struct vgz *vg, const void *ibuf,
VGZ_WrwGunzip(struct worker *w, struct vgz *vg, const void *ibuf,
ssize_t ibufl, char *obuf, ssize_t obufl, ssize_t *obufp)
{
int i;
......@@ -375,9 +375,9 @@ VGZ_WrwGunzip(const struct sess *sp, struct vgz *vg, const void *ibuf,
return (-1);
}
if (obufl == *obufp || i == VGZ_STUCK) {
sp->wrk->acct_tmp.bodybytes += *obufp;
(void)WRW_Write(sp->wrk, obuf, *obufp);
(void)WRW_Flush(sp->wrk);
w->acct_tmp.bodybytes += *obufp;
(void)WRW_Write(w, obuf, *obufp);
(void)WRW_Flush(w);
*obufp = 0;
VGZ_Obuf(vg, obuf + *obufp, obufl - *obufp);
}
......@@ -474,7 +474,7 @@ vfp_gunzip_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes)
assert(i == VGZ_OK || i == VGZ_END);
sp->obj->len += dl;
if (sp->wrk->do_stream)
RES_StreamPoll(sp);
RES_StreamPoll(sp->wrk);
}
if (i == Z_OK || i == Z_STREAM_END)
return (1);
......@@ -549,7 +549,7 @@ vfp_gzip_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes)
assert(i == Z_OK);
sp->obj->len += dl;
if (sp->wrk->do_stream)
RES_StreamPoll(sp);
RES_StreamPoll(sp->wrk);
}
return (1);
}
......@@ -573,7 +573,7 @@ vfp_gzip_end(struct sess *sp)
sp->obj->len += dl;
} while (i != Z_STREAM_END);
if (sp->wrk->do_stream)
RES_StreamPoll(sp);
RES_StreamPoll(sp->wrk);
VGZ_UpdateObj(vg, sp->obj);
VGZ_Destroy(&vg);
return (0);
......@@ -631,7 +631,7 @@ vfp_testgzip_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes)
st->len += w;
sp->obj->len += w;
if (sp->wrk->do_stream)
RES_StreamPoll(sp);
RES_StreamPoll(sp->wrk);
while (!VGZ_IbufEmpty(vg)) {
VGZ_Obuf(vg, obuf, sizeof obuf);
......
......@@ -172,7 +172,7 @@ res_WriteGunzipObj(const struct sess *sp)
VSC_C_main->n_objwrite++;
i = VGZ_WrwGunzip(sp, vg,
i = VGZ_WrwGunzip(sp->wrk, vg,
st->ptr, st->len,
obuf, sizeof obuf, &obufl);
/* XXX: error check */
......@@ -354,50 +354,52 @@ RES_StreamStart(struct sess *sp)
}
void
RES_StreamPoll(const struct sess *sp)
RES_StreamPoll(struct worker *w)
{
struct stream_ctx *sctx;
struct storage *st;
ssize_t l, l2;
void *ptr;
sctx = sp->wrk->sctx;
CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(w->fetch_obj, OBJECT_MAGIC);
sctx = w->sctx;
CHECK_OBJ_NOTNULL(sctx, STREAM_CTX_MAGIC);
if (sp->obj->len == sctx->stream_next)
if (w->fetch_obj->len == sctx->stream_next)
return;
assert(sp->obj->len > sctx->stream_next);
assert(w->fetch_obj->len > sctx->stream_next);
l = sctx->stream_front;
VTAILQ_FOREACH(st, &sp->obj->store, list) {
VTAILQ_FOREACH(st, &w->fetch_obj->store, list) {
if (st->len + l <= sctx->stream_next) {
l += st->len;
continue;
}
l2 = st->len + l - sctx->stream_next;
ptr = st->ptr + (sctx->stream_next - l);
if (sp->wrk->res_mode & RES_GUNZIP) {
(void)VGZ_WrwGunzip(sp, sctx->vgz, ptr, l2,
if (w->res_mode & RES_GUNZIP) {
(void)VGZ_WrwGunzip(w, sctx->vgz, ptr, l2,
sctx->obuf, sctx->obuf_len, &sctx->obuf_ptr);
} else {
(void)WRW_Write(sp->wrk, ptr, l2);
(void)WRW_Write(w, ptr, l2);
}
l += st->len;
sctx->stream_next += l2;
}
if (!(sp->wrk->res_mode & RES_GUNZIP))
(void)WRW_Flush(sp->wrk);
if (!(w->res_mode & RES_GUNZIP))
(void)WRW_Flush(w);
if (sp->obj->objcore == NULL ||
(sp->obj->objcore->flags & OC_F_PASS)) {
if (w->fetch_obj->objcore == NULL ||
(w->fetch_obj->objcore->flags & OC_F_PASS)) {
/*
* This is a pass object, release storage as soon as we
* have delivered it.
*/
while (1) {
st = VTAILQ_FIRST(&sp->obj->store);
st = VTAILQ_FIRST(&w->fetch_obj->store);
if (st == NULL ||
sctx->stream_front + st->len > sctx->stream_next)
break;
VTAILQ_REMOVE(&sp->obj->store, st, list);
VTAILQ_REMOVE(&w->fetch_obj->store, st, list);
sctx->stream_front += st->len;
STV_free(st);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment