Commit 0783808a authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Split the init and fini functions out for VFP's.

parent 40d5594d
......@@ -885,8 +885,6 @@ void VFP_Init(void);
void VFP_Fetch_Body(struct busyobj *bo, ssize_t est);
void VFP_Push(struct busyobj *, const struct vfp *, intptr_t priv);
enum vfp_status VFP_Suck(struct busyobj *, void *p, ssize_t *lp);
extern char vfp_init[];
extern char vfp_fini[];
/* cache_gzip.c */
struct vgz;
......
......@@ -141,6 +141,29 @@ vfp_esi_end(struct busyobj *bo, struct vef_priv *vef, enum vfp_status retval)
return (retval);
}
static enum vfp_status __match_proto__(vfp_init_f)
vfp_esi_gzip_init(struct busyobj *bo, struct vfp_entry *vfe)
{
struct vef_priv *vef;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
ALLOC_OBJ(vef, VEF_MAGIC);
if (vef == NULL)
return (VFP_ERROR);
vef->vgz = VGZ_NewGzip(bo->vsl, "G F E");
vef->vep = VEP_Init(bo, vfp_vep_callback, vef);
vef->ibuf_sz = cache_param->gzip_buffer;
vef->ibuf = calloc(1L, vef->ibuf_sz);
if (vef->ibuf == NULL)
return (vfp_esi_end(bo, vef, VFP_ERROR));
XXXAN(vef->ibuf);
vef->ibuf_i = vef->ibuf;
vef->ibuf_o = vef->ibuf;
vfe->priv1 = vef;
return (VFP_OK);
}
static enum vfp_status __match_proto__(vfp_pull_f)
vfp_esi_gzip_pull(struct busyobj *bo, void *p, ssize_t *lp,
struct vfp_entry *vfe)
......@@ -151,29 +174,10 @@ vfp_esi_gzip_pull(struct busyobj *bo, void *p, ssize_t *lp,
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init) {
ALLOC_OBJ(vef, VEF_MAGIC);
XXXAN(vef);
vef->vgz = VGZ_NewGzip(bo->vsl, "G F E");
vef->vep = VEP_Init(bo, vfp_vep_callback, vef);
vef->ibuf_sz = cache_param->gzip_buffer;
vef->ibuf = calloc(1L, vef->ibuf_sz);
XXXAN(vef->ibuf);
vef->ibuf_i = vef->ibuf;
vef->ibuf_o = vef->ibuf;
vfe->priv1 = vef;
return (VFP_OK);
}
if (p == vfp_fini) {
if (vfe->priv1 != NULL)
(void)vfp_esi_end(bo, vfe->priv1, VFP_ERROR);
vfe->priv1 = NULL;
return (VFP_ERROR);
}
CAST_OBJ_NOTNULL(vef, vfe->priv1, VEF_MAGIC);
AN(p);
AN(lp);
*lp = 0;
CAST_OBJ_NOTNULL(vef, vfe->priv1, VEF_MAGIC);
l = vef->ibuf_sz - (vef->ibuf_i - vef->ibuf);
if (DO_DEBUG(DBG_ESI_CHOP)) {
d = (random() & 3) + 1;
......@@ -203,6 +207,19 @@ vfp_esi_gzip_pull(struct busyobj *bo, void *p, ssize_t *lp,
return (vp);
}
static enum vfp_status __match_proto__(vfp_init_f)
vfp_esi_init(struct busyobj *bo, struct vfp_entry *vfe)
{
struct vef_priv *vef;
ALLOC_OBJ(vef, VEF_MAGIC);
if (vef == NULL)
return (VFP_ERROR);
vef->vep = VEP_Init(bo, NULL, NULL);
vfe->priv1 = vef;
return (VFP_OK);
}
static enum vfp_status __match_proto__(vfp_pull_f)
vfp_esi_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
{
......@@ -212,22 +229,9 @@ vfp_esi_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init) {
ALLOC_OBJ(vef, VEF_MAGIC);
XXXAN(vef);
vef->vep = VEP_Init(bo, NULL, NULL);
vfe->priv1 = vef;
return (VFP_OK);
}
if (p == vfp_fini) {
if (vfe->priv1 != NULL)
(void)vfp_esi_end(bo, vfe->priv1, VFP_ERROR);
vfe->priv1 = NULL;
return (VFP_ERROR);
}
CAST_OBJ_NOTNULL(vef, vfe->priv1, VEF_MAGIC);
AN(p);
AN(lp);
CAST_OBJ_NOTNULL(vef, vfe->priv1, VEF_MAGIC);
if (DO_DEBUG(DBG_ESI_CHOP)) {
d = (random() & 3) + 1;
if (d < *lp)
......@@ -243,10 +247,27 @@ vfp_esi_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
return (vp);
}
static void __match_proto__(vfp_fini_f)
vfp_esi_fini(struct busyobj *bo, struct vfp_entry *vfe)
{
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (vfe->priv1 != NULL)
(void)vfp_esi_end(bo, vfe->priv1, VFP_ERROR);
vfe->priv1 = NULL;
}
const struct vfp vfp_esi = {
.name = "ESI",
.init = vfp_esi_init,
.pull = vfp_esi_pull,
.fini = vfp_esi_fini,
};
const struct vfp vfp_esi_gzip = {
.name = "ESI_GZIP",
.init = vfp_esi_gzip_init,
.pull = vfp_esi_gzip_pull,
.fini = vfp_esi_fini,
};
......@@ -43,9 +43,6 @@
static unsigned fetchfrag;
char vfp_init[] = "<init>";
char vfp_fini[] = "<fini>";
/*--------------------------------------------------------------------
* We want to issue the first error we encounter on fetching and
* supress the rest. This function does that.
......@@ -111,35 +108,33 @@ VFP_GetStorage(struct busyobj *bo, ssize_t sz)
/**********************************************************************
*/
static enum vfp_status
vfp_call(struct busyobj *bo, struct vfp_entry *vfe, void *p, ssize_t *lp)
{
AN(vfe->vfp->pull);
return (vfe->vfp->pull(bo, p, lp, vfe));
}
static void
vfp_suck_fini(struct busyobj *bo)
{
struct vfp_entry *vfe;
VTAILQ_FOREACH(vfe, &bo->vfp, list) {
if(vfe->vfp != NULL)
(void)vfp_call(bo, vfe, vfp_fini, NULL);
if(vfe->vfp != NULL && vfe->vfp->fini != NULL)
vfe->vfp->fini(bo, vfe);
}
}
static enum vfp_status
vfp_suck_init(struct busyobj *bo)
{
enum vfp_status retval = VFP_ERROR;
enum vfp_status retval = VFP_OK;
struct vfp_entry *vfe;
VTAILQ_FOREACH(vfe, &bo->vfp, list) {
retval = vfp_call(bo, vfe, vfp_init, NULL);
if (vfe->vfp->init == NULL)
continue;
retval = vfe->vfp->init(bo, vfe);
if (retval != VFP_OK) {
(void)VFP_Error(bo,
"Fetch filter %s failed to initialize",
vfe->vfp->name);
vfp_suck_fini(bo);
break;
return (retval);
}
}
return (retval);
......@@ -170,9 +165,13 @@ VFP_Suck(struct busyobj *bo, void *p, ssize_t *lp)
bo->vfp_nxt = vfe;
return (vp);
} else {
vp = vfp_call(bo, vfe, p, lp);
vp = vfe->vfp->pull(bo, p, lp, vfe);
if (vp == VFP_ERROR)
(void)VFP_Error(bo, "Fetch filter %s returned %d",
vfe->vfp->name, vp);
if (vp != VFP_OK) {
(void)vfp_call(bo, vfe, vfp_fini, NULL);
if (vfe->vfp->fini != NULL)
vfe->vfp->fini(bo, vfe);
vfe->vfp = NULL;
vfe->priv2 = vp;
}
......
......@@ -38,11 +38,19 @@ enum vfp_status {
VFP_OK = 0,
VFP_END = 1,
};
typedef enum vfp_status vfp_init_f(struct busyobj *, struct vfp_entry *);
typedef enum vfp_status
vfp_pull_f(struct busyobj *, void *ptr, ssize_t *len, struct vfp_entry *);
typedef void vfp_fini_f(struct busyobj *, struct vfp_entry *);
struct vfp {
const char *name;
vfp_init_f *init;
vfp_pull_f *pull;
vfp_fini_f *fini;
const void *priv1;
intptr_t priv2;
};
extern const struct vfp vfp_gunzip;
......
......@@ -444,6 +444,30 @@ VGZ_Destroy(struct vgz **vgp)
return (vr);
}
/*--------------------------------------------------------------------*/
static enum vfp_status __match_proto__(vfp_init_f)
vfp_gzip_init(struct busyobj *bo, struct vfp_entry *vfe)
{
struct vgz *vg;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (vfe->vfp->priv2)
vg = VGZ_NewGzip(bo->vsl, vfe->vfp->priv1);
else
vg = VGZ_NewUngzip(bo->vsl, vfe->vfp->priv1);
if (vg == NULL)
return (VFP_ERROR);
if (vgz_getmbuf(vg))
return (VFP_ERROR);
vfe->priv1 = vg;
VGZ_Ibuf(vg, vg->m_buf, 0);
AZ(vg->m_len);
return (VFP_OK);
}
/*--------------------------------------------------------------------
* VFP_GUNZIP
*
......@@ -462,26 +486,9 @@ vfp_gunzip_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init) {
vg = VGZ_NewUngzip(bo->vsl, "U F -");
XXXAZ(vgz_getmbuf(vg));
vfe->priv1 = vg;
VGZ_Ibuf(vg, vg->m_buf, 0);
AZ(vg->m_len);
return (VFP_OK);
}
if (p == vfp_fini) {
if (vfe->priv1 != NULL) {
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
vfe->priv1 = NULL;
(void)VGZ_Destroy(&vg);
}
vfe->priv1 = NULL;
return (VFP_ERROR);
}
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
AN(p);
AN(lp);
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
l = *lp;
*lp = 0;
VGZ_Obuf(vg, p, l);
......@@ -513,10 +520,6 @@ vfp_gunzip_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
return (vp);
}
const struct vfp vfp_gunzip = {
.pull = vfp_gunzip_pull,
};
/*--------------------------------------------------------------------
* VFP_GZIP
......@@ -536,26 +539,9 @@ vfp_gzip_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init) {
vg = VGZ_NewGzip(bo->vsl, "G F -");
XXXAZ(vgz_getmbuf(vg));
vfe->priv1 = vg;
VGZ_Ibuf(vg, vg->m_buf, 0);
AZ(vg->m_len);
vg->flag = VGZ_NORMAL;
return (VFP_OK);
}
if (p == vfp_fini) {
if (vfe->priv1 != NULL) {
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
vfe->priv1 = NULL;
(void)VGZ_Destroy(&vg);
}
return (VFP_ERROR);
}
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
AN(p);
AN(lp);
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
l = *lp;
*lp = 0;
VGZ_Obuf(vg, p, l);
......@@ -588,10 +574,6 @@ vfp_gzip_pull(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
return (VFP_END);
}
const struct vfp vfp_gzip = {
.pull = vfp_gzip_pull,
};
/*--------------------------------------------------------------------
* VFP_TESTGZIP
*
......@@ -611,21 +593,7 @@ vfp_testgunzip_pull(struct busyobj *bo, void *p, ssize_t *lp,
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init) {
vg = VGZ_NewUngzip(bo->vsl, "u F -");
XXXAZ(vgz_getmbuf(vg));
vfe->priv1 = vg;
AZ(vg->m_len);
return (VFP_OK);
}
if (p == vfp_fini) {
if (vfe->priv1 != NULL) {
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
vfe->priv1 = NULL;
(void)VGZ_Destroy(&vg);
}
return (VFP_ERROR);
}
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
AN(p);
AN(lp);
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
......@@ -652,6 +620,46 @@ vfp_testgunzip_pull(struct busyobj *bo, void *p, ssize_t *lp,
return (vp);
}
/*--------------------------------------------------------------------*/
static void __match_proto__(vfp_fini_f)
vfp_gzip_fini(struct busyobj *bo, struct vfp_entry *vfe)
{
struct vgz *vg;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (vfe->priv1 != NULL) {
CAST_OBJ_NOTNULL(vg, vfe->priv1, VGZ_MAGIC);
vfe->priv1 = NULL;
(void)VGZ_Destroy(&vg);
}
}
/*--------------------------------------------------------------------*/
const struct vfp vfp_gunzip = {
.name = "GUNZIP",
.init = vfp_gzip_init,
.pull = vfp_gunzip_pull,
.fini = vfp_gzip_fini,
.priv1 = "U F -",
};
const struct vfp vfp_gzip = {
.name = "GZIP",
.init = vfp_gzip_init,
.pull = vfp_gzip_pull,
.fini = vfp_gzip_fini,
.priv1 = "G F -",
.priv2 = 1,
};
const struct vfp vfp_testgunzip = {
.name = "TESTGUNZIP",
.init = vfp_gzip_init,
.pull = vfp_testgunzip_pull,
.fini = vfp_gzip_fini,
.priv1 = "u F -",
};
......@@ -77,10 +77,6 @@ v1f_pull_straight(struct busyobj *bo, void *p, ssize_t *lp,
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init)
return (VFP_OK);
if (p == vfp_fini)
return (VFP_ERROR);
AN(p);
AN(lp);
......@@ -103,6 +99,7 @@ v1f_pull_straight(struct busyobj *bo, void *p, ssize_t *lp,
}
static const struct vfp v1f_straight = {
.name = "V1F_STRAIGHT",
.pull = v1f_pull_straight,
};
......@@ -121,10 +118,6 @@ v1f_pull_chunked(struct busyobj *bo, void *p, ssize_t *lp,
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init)
return (VFP_OK);
if (p == vfp_fini)
return (VFP_ERROR);
AN(p);
AN(lp);
......@@ -142,6 +135,7 @@ v1f_pull_chunked(struct busyobj *bo, void *p, ssize_t *lp,
}
static const struct vfp v1f_chunked = {
.name = "V1F_CHUNKED",
.pull = v1f_pull_chunked,
};
......@@ -154,10 +148,6 @@ v1f_pull_eof(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(vfe, VFP_ENTRY_MAGIC);
if (p == vfp_init)
return (VFP_OK);
if (p == vfp_fini)
return (VFP_ERROR);
AN(p);
AN(lp);
......@@ -173,6 +163,7 @@ v1f_pull_eof(struct busyobj *bo, void *p, ssize_t *lp, struct vfp_entry *vfe)
}
static const struct vfp v1f_eof = {
.name = "V1F_EOF",
.pull = v1f_pull_eof,
};
......
......@@ -113,6 +113,7 @@
-sem(EXP_Inject, custodial(1))
-sem(WS_Init, custodial(2))
-sem(http_Setup, custodial(2))
-sem(vfp_esi_end, custodial(2))
-sem(vdi_dns_cache_list_add, custodial(3))
......
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