Commit e6568354 authored by Dag Haavi Finstad's avatar Dag Haavi Finstad

Make the VRTPRIV_* interface slightly more generic to let us use it without...

Make the VRTPRIV_* interface slightly more generic to let us use it without needing a req/sess pointer.
parent 9fd7bb74
......@@ -119,7 +119,7 @@ struct sess;
struct sesspool;
struct vbc;
struct vrt_backend;
struct vrt_privs;
struct vrt_priv;
struct vsb;
struct waitinglist;
struct worker;
......@@ -299,6 +299,14 @@ struct vxid_pool {
/*--------------------------------------------------------------------*/
struct vrt_privs {
unsigned magic;
#define VRT_PRIVS_MAGIC 0x03ba7501
VTAILQ_HEAD(,vrt_priv) privs;
};
/*--------------------------------------------------------------------*/
struct wrk_accept {
unsigned magic;
#define WRK_ACCEPT_MAGIC 0x8c4b4d59
......@@ -663,7 +671,7 @@ struct sess {
double t_open; /* fd accepted */
double t_idle; /* fd accepted or resp sent */
VTAILQ_HEAD(,vrt_privs) privs;
struct vrt_privs privs[1];
#if defined(HAVE_EPOLL_CTL)
struct epoll_event ev;
......@@ -1046,7 +1054,8 @@ const char *VCL_Method_Name(unsigned);
*/
const char *VRT_String(struct ws *ws, const char *h, const char *p, va_list ap);
char *VRT_StringList(char *d, unsigned dl, const char *p, va_list ap);
void VRTPRIV_dynamic_kill(struct sess *sp, uintptr_t id);
void VRTPRIV_init(struct vrt_privs *privs);
void VRTPRIV_dynamic_kill(struct vrt_privs *privs, uintptr_t id);
void ESI_Deliver(struct req *);
void ESI_DeliverChild(struct req *, struct busyobj *);
......
......@@ -91,7 +91,7 @@ ses_new(struct sesspool *pp)
sp->t_open = NAN;
sp->t_idle = NAN;
VTAILQ_INIT(&sp->privs);
VRTPRIV_init(sp->privs);
Lck_New(&sp->mtx, lck_sess);
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
return (sp);
......@@ -300,7 +300,7 @@ SES_Delete(struct sess *sp, enum sess_close reason, double now)
now = VTIM_real();
AZ(isnan(sp->t_open));
assert(VTAILQ_EMPTY(&sp->privs));
assert(VTAILQ_EMPTY(&sp->privs->privs));
VSL(SLT_SessClose, sp->vxid, "%s %.3f",
sess_close_2str(sp->reason, 0), now - sp->t_open);
VSL(SLT_End, sp->vxid, "%s", "");
......
......@@ -40,10 +40,10 @@
#include "vcl.h"
#include "vrt.h"
struct vrt_privs {
struct vrt_priv {
unsigned magic;
#define VRT_PRIVS_MAGIC 0x24157a52
VTAILQ_ENTRY(vrt_privs) list;
#define VRT_PRIV_MAGIC 0x24157a52
VTAILQ_ENTRY(vrt_priv) list;
struct vmod_priv priv[1];
const struct VCL_conf *vcl;
uintptr_t id;
......@@ -53,40 +53,51 @@ struct vrt_privs {
/*--------------------------------------------------------------------
*/
void
VRTPRIV_init(struct vrt_privs *privs)
{
privs->magic = VRT_PRIVS_MAGIC;
VTAILQ_INIT(&privs->privs);
}
static struct vmod_priv *
VRT_priv_dynamic(VRT_CTX, uintptr_t id, uintptr_t vmod_id)
{
struct vrt_privs *vps;
struct vrt_priv *vp;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
VTAILQ_FOREACH(vps, &ctx->req->sp->privs, list) {
CHECK_OBJ_NOTNULL(vps, VRT_PRIVS_MAGIC);
if (vps->vcl == ctx->vcl && vps->id == id
&& vps->vmod_id == vmod_id)
return (vps->priv);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req->sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req->sp->privs, VRT_PRIVS_MAGIC);
VTAILQ_FOREACH(vp, &ctx->req->sp->privs->privs, list) {
CHECK_OBJ_NOTNULL(vp, VRT_PRIV_MAGIC);
if (vp->vcl == ctx->vcl && vp->id == id
&& vp->vmod_id == vmod_id)
return (vp->priv);
}
ALLOC_OBJ(vps, VRT_PRIVS_MAGIC);
AN(vps);
vps->vcl = ctx->vcl;
vps->id = id;
vps->vmod_id = vmod_id;
VTAILQ_INSERT_TAIL(&ctx->req->sp->privs, vps, list);
return (vps->priv);
ALLOC_OBJ(vp, VRT_PRIV_MAGIC);
AN(vp);
vp->vcl = ctx->vcl;
vp->id = id;
vp->vmod_id = vmod_id;
VTAILQ_INSERT_TAIL(&ctx->req->sp->privs->privs, vp, list);
return (vp->priv);
}
void
VRTPRIV_dynamic_kill(struct sess *sp, uintptr_t id)
VRTPRIV_dynamic_kill(struct vrt_privs *privs, uintptr_t id)
{
struct vrt_privs *vps, *vps1;
struct vrt_priv *vp, *vp1;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(privs, VRT_PRIVS_MAGIC);
VTAILQ_FOREACH_SAFE(vps, &sp->privs, list, vps1) {
CHECK_OBJ_NOTNULL(vps, VRT_PRIVS_MAGIC);
if (id == vps->id) {
VTAILQ_REMOVE(&sp->privs, vps, list);
VRT_priv_fini(vps->priv);
FREE_OBJ(vps);
VTAILQ_FOREACH_SAFE(vp, &privs->privs, list, vp1) {
CHECK_OBJ_NOTNULL(vp, VRT_PRIV_MAGIC);
if (id == vp->id) {
VTAILQ_REMOVE(&privs->privs, vp, list);
VRT_priv_fini(vp->priv);
FREE_OBJ(vp);
}
}
}
......@@ -107,4 +118,3 @@ VRT_priv_fini(const struct vmod_priv *p)
if (p->priv != (void*)0 && p->free != (void*)0)
p->free(p->priv);
}
......@@ -166,7 +166,7 @@ http1_cleanup(struct sess *sp, struct worker *wrk, struct req *req)
req->vcl = NULL;
}
VRTPRIV_dynamic_kill(sp, (uintptr_t)req);
VRTPRIV_dynamic_kill(sp->privs, (uintptr_t)req);
/* Charge and log byte counters */
AN(req->vsl->wid);
CNT_AcctLogCharge(wrk->stats, req);
......
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