Commit d4d7b385 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Give struct worker a private stash for things vmods should not frob.

parent 525fe180
......@@ -87,23 +87,24 @@ enum {
/*--------------------------------------------------------------------*/
struct VSC_lck;
struct VSC_main;
struct VSC_main_wrk;
struct ban;
struct ban_proto;
struct cli;
struct http_conn;
struct listen_sock;
struct mempool;
struct objcore;
struct objhead;
struct pool;
struct req_step;
struct sess;
struct transport;
struct worker;
struct listen_sock;
struct vcf;
struct req_step;
struct VSC_lck;
struct VSC_main;
struct VSC_main_wrk;
struct worker;
struct worker_priv;
#define DIGEST_LEN 32
......@@ -182,13 +183,6 @@ struct vsl_log {
/*--------------------------------------------------------------------*/
struct vxid_pool {
uint32_t next;
uint32_t count;
};
/*--------------------------------------------------------------------*/
VRBT_HEAD(vrt_privs, vrt_priv);
/* Worker pool stuff -------------------------------------------------*/
......@@ -229,17 +223,15 @@ enum task_prio {
struct worker {
unsigned magic;
#define WORKER_MAGIC 0x6391adcf
int strangelove;
struct worker_priv *wpriv;
struct pool *pool;
struct objhead *nobjhead;
struct objcore *nobjcore;
void *nhashpriv;
struct VSC_main_wrk *stats;
struct vsl_log *vsl; // borrowed from req/bo
struct pool_task task[1];
vtim_real lastused;
int strangelove;
struct v1l *v1l;
......@@ -249,8 +241,6 @@ struct worker {
struct ws aws[1];
struct vxid_pool vxid_pool;
unsigned cur_method;
unsigned seen_methods;
unsigned handling;
......@@ -658,7 +648,7 @@ extern const char H__Reason[];
/* cache_main.c */
#define VXID(u) ((u) & VSL_IDENTMASK)
uint32_t VXID_Get(struct worker *, uint32_t marker);
uint32_t VXID_Get(const struct worker *, uint32_t marker);
extern pthread_key_t witness_key;
/* cache_lck.c */
......
......@@ -82,7 +82,7 @@ vbo_Free(struct busyobj **bop)
}
struct busyobj *
VBO_GetBusyObj(struct worker *wrk, const struct req *req)
VBO_GetBusyObj(const struct worker *wrk, const struct req *req)
{
struct busyobj *bo;
uint16_t nhttp;
......
......@@ -115,15 +115,15 @@ hsh_prealloc(struct worker *wrk)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
if (wrk->nobjcore == NULL)
wrk->nobjcore = ObjNew(wrk);
CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC);
if (wrk->wpriv->nobjcore == NULL)
wrk->wpriv->nobjcore = ObjNew(wrk);
CHECK_OBJ_NOTNULL(wrk->wpriv->nobjcore, OBJCORE_MAGIC);
if (wrk->nobjhead == NULL) {
wrk->nobjhead = hsh_newobjhead();
if (wrk->wpriv->nobjhead == NULL) {
wrk->wpriv->nobjhead = hsh_newobjhead();
wrk->stats->n_objecthead++;
}
CHECK_OBJ_NOTNULL(wrk->nobjhead, OBJHEAD_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
if (hash->prep != NULL)
hash->prep(wrk);
......@@ -151,23 +151,26 @@ HSH_Private(const struct worker *wrk)
}
/*---------------------------------------------------------------------*/
void
HSH_Cleanup(struct worker *wrk)
HSH_Cleanup(const struct worker *wrk)
{
if (wrk->nobjcore != NULL)
ObjDestroy(wrk, &wrk->nobjcore);
if (wrk->nobjhead != NULL) {
Lck_Delete(&wrk->nobjhead->mtx);
FREE_OBJ(wrk->nobjhead);
wrk->nobjhead = NULL;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
if (wrk->wpriv->nobjcore != NULL)
ObjDestroy(wrk, &wrk->wpriv->nobjcore);
if (wrk->wpriv->nobjhead != NULL) {
Lck_Delete(&wrk->wpriv->nobjhead->mtx);
FREE_OBJ(wrk->wpriv->nobjhead);
wrk->wpriv->nobjhead = NULL;
wrk->stats->n_objecthead--;
}
if (wrk->nhashpriv != NULL) {
if (wrk->wpriv->nhashpriv != NULL) {
/* XXX: If needed, add slinger method for this */
free(wrk->nhashpriv);
wrk->nhashpriv = NULL;
free(wrk->wpriv->nhashpriv);
wrk->wpriv->nhashpriv = NULL;
}
}
......@@ -285,6 +288,7 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
struct rush rush;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
AN(digest);
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
AN(ban);
......@@ -295,8 +299,8 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
hsh_prealloc(wrk);
AN(wrk->nobjhead);
oh = hash->lookup(wrk, digest, &wrk->nobjhead);
AN(wrk->wpriv->nobjhead);
oh = hash->lookup(wrk, digest, &wrk->wpriv->nobjhead);
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
Lck_AssertHeld(&oh->mtx);
assert(oh->refcnt > 0);
......@@ -329,15 +333,17 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
*/
static struct objcore *
hsh_insert_busyobj(struct worker *wrk, struct objhead *oh)
hsh_insert_busyobj(const struct worker *wrk, struct objhead *oh)
{
struct objcore *oc;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
Lck_AssertHeld(&oh->mtx);
oc = wrk->nobjcore;
wrk->nobjcore = NULL;
oc = wrk->wpriv->nobjcore;
wrk->wpriv->nobjcore = NULL;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
AN(oc->flags & OC_F_BUSY);
......@@ -372,6 +378,7 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
wrk = req->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
CHECK_OBJ_NOTNULL(req->http, HTTP_MAGIC);
CHECK_OBJ_ORNULL(req->vcf, VCF_MAGIC);
AN(hash);
......@@ -390,8 +397,8 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
Lck_Lock(&oh->mtx);
req->hash_objhead = NULL;
} else {
AN(wrk->nobjhead);
oh = hash->lookup(wrk, req->digest, &wrk->nobjhead);
AN(wrk->wpriv->nobjhead);
oh = hash->lookup(wrk, req->digest, &wrk->wpriv->nobjhead);
}
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
......
......@@ -166,12 +166,13 @@ static uint32_t vxid_chunk = 32768;
static struct lock vxid_lock;
uint32_t
VXID_Get(struct worker *wrk, uint32_t mask)
VXID_Get(const struct worker *wrk, uint32_t mask)
{
struct vxid_pool *v;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
v = &wrk->vxid_pool;
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
v = wrk->wpriv->vxid_pool;
AZ(VXID(mask));
do {
if (v->count == 0) {
......
......@@ -1138,7 +1138,8 @@ CNT_Request(struct req *req)
* pointers still pointing to the things we expect.
*/
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
CHECK_OBJ_ORNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AN(req->req_step);
......@@ -1147,7 +1148,7 @@ CNT_Request(struct req *req)
if (DO_DEBUG(DBG_REQ_STATE))
cnt_diag(req, req->req_step->name);
nxt = req->req_step->func(wrk, req);
CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
CHECK_OBJ_ORNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
}
wrk->vsl = NULL;
if (nxt == REQ_FSM_DONE) {
......
......@@ -65,6 +65,24 @@ struct req_step {
extern const struct req_step R_STP_TRANSPORT[1];
extern const struct req_step R_STP_RECV[1];
struct vxid_pool {
uint32_t next;
uint32_t count;
};
/*--------------------------------------------------------------------
* Private part of worker threads
*/
struct worker_priv {
unsigned magic;
#define WORKER_PRIV_MAGIC 0x3047db99
struct objhead *nobjhead;
struct objcore *nobjcore;
void *nhashpriv;
struct vxid_pool vxid_pool[1];
};
/*--------------------------------------------------------------------
* HTTP Protocol connection structure
*
......@@ -158,7 +176,7 @@ void BAN_RefBan(struct objcore *oc, struct ban *);
vtim_real BAN_Time(const struct ban *ban);
/* cache_busyobj.c */
struct busyobj *VBO_GetBusyObj(struct worker *, const struct req *);
struct busyobj *VBO_GetBusyObj(const struct worker *, const struct req *);
void VBO_ReleaseBusyObj(struct worker *wrk, struct busyobj **busyobj);
/* cache_director.c */
......
......@@ -87,6 +87,7 @@ wrk_bgthread(void *arg)
{
struct bgthread *bt;
struct worker wrk;
struct worker_priv wpriv[1];
struct VSC_main_wrk ds;
void *r;
......@@ -94,6 +95,8 @@ wrk_bgthread(void *arg)
THR_SetName(bt->name);
THR_Init();
INIT_OBJ(&wrk, WORKER_MAGIC);
INIT_OBJ(wpriv, WORKER_PRIV_MAGIC);
wrk.wpriv = wpriv;
memset(&ds, 0, sizeof ds);
wrk.stats = &ds;
......@@ -128,6 +131,7 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
struct worker *w, ww;
struct VSC_main_wrk ds;
unsigned char ws[thread_workspace];
struct worker_priv wpriv[1];
AN(qp);
AN(stacksize);
......@@ -136,6 +140,8 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
THR_SetName("cache-worker");
w = &ww;
INIT_OBJ(w, WORKER_MAGIC);
INIT_OBJ(wpriv, WORKER_PRIV_MAGIC);
w->wpriv = wpriv;
w->lastused = NAN;
memset(&ds, 0, sizeof ds);
w->stats = &ds;
......
......@@ -192,8 +192,8 @@ hcb_crit_bit(const uint8_t *digest, const struct objhead *oh2, struct hcb_y *y)
*/
static struct objhead *
hcb_insert(struct worker *wrk, struct hcb_root *root, const uint8_t *digest,
struct objhead **noh)
hcb_insert(const struct worker *wrk, struct hcb_root *root,
const uint8_t *digest, struct objhead **noh)
{
volatile uintptr_t *p;
uintptr_t pp;
......@@ -242,8 +242,8 @@ hcb_insert(struct worker *wrk, struct hcb_root *root, const uint8_t *digest,
/* Insert */
CAST_OBJ_NOTNULL(y2, wrk->nhashpriv, HCB_Y_MAGIC);
wrk->nhashpriv = NULL;
CAST_OBJ_NOTNULL(y2, wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
wrk->wpriv->nhashpriv = NULL;
(void)hcb_crit_bit(digest, oh2, y2);
s2 = (digest[y2->ptr] & y2->bitmask) != 0;
assert(s2 < 2);
......@@ -405,7 +405,7 @@ hcb_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
while (1) {
/* No luck, try with lock held, so we can modify tree */
CAST_OBJ_NOTNULL(y, wrk->nhashpriv, HCB_Y_MAGIC);
CAST_OBJ_NOTNULL(y, wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
Lck_Lock(&hcb_mtx);
VSC_C_main->hcb_lock++;
oh = hcb_insert(wrk, &hcb_root, digest, noh);
......@@ -440,10 +440,10 @@ hcb_prep(struct worker *wrk)
{
struct hcb_y *y;
if (wrk->nhashpriv == NULL) {
if (wrk->wpriv->nhashpriv == NULL) {
ALLOC_OBJ(y, HCB_Y_MAGIC);
AN(y);
wrk->nhashpriv = y;
wrk->wpriv->nhashpriv = y;
}
}
......
......@@ -66,7 +66,7 @@ void HSH_config(const char *);
/* cache_hash.c */
void HSH_Init(const struct hash_slinger *);
void HSH_Cleanup(struct worker *);
void HSH_Cleanup(const struct worker *);
extern const struct hash_slinger hsl_slinger;
extern const struct hash_slinger hcl_slinger;
......
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