static void * vbp_wrk_poll_backend(void *priv) { struct vbp_target *vt; THR_SetName("backend poll"); CAST_OBJ_NOTNULL(vt, priv, VBP_TARGET_MAGIC); while (!vt->stop) { AN(vt->req); assert(vt->req_len > 0); if (!vt->disable) { vbp_start_poke(vt); vbp_poke(vt); vbp_has_poked(vt); } if (!vt->stop) VTIM_sleep(vt->probe.interval); } Lck_Delete(&vt->mtx); VTAILQ_REMOVE(&vbp_list, vt, list); VBT_Rel(&vt->tcp_pool); free(vt->req); FREE_OBJ(vt); return (NULL); }
/*---------------------------------------------------------------------*/ void HSH_Cleanup(struct worker *wrk) { if (wrk->nobjcore != NULL) { FREE_OBJ(wrk->nobjcore); wrk->stats->n_objectcore--; wrk->nobjcore = NULL; } if (wrk->nobjhead != NULL) { Lck_Delete(&wrk->nobjhead->mtx); FREE_OBJ(wrk->nobjhead); wrk->nobjhead = NULL; wrk->stats->n_objecthead--; } if (wrk->nwaitinglist != NULL) { FREE_OBJ(wrk->nwaitinglist); wrk->nwaitinglist = NULL; wrk->stats->n_waitinglist--; } if (wrk->nhashpriv != NULL) { /* XXX: If needed, add slinger method for this */ free(wrk->nhashpriv); wrk->nhashpriv = NULL; } }
void SES_Delete(struct sess *sp, enum sess_close reason, double now) { struct sesspool *pp; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); pp = sp->sesspool; CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC); AN(pp->pool); if (reason != SC_NULL) SES_Close(sp, reason); assert(sp->fd < 0); if (isnan(now)) now = VTIM_real(); AZ(isnan(sp->t_open)); VSL(SLT_SessClose, sp->vxid, "%s %.3f", sess_close_2str(sp->reason, 0), now - sp->t_open); VSL(SLT_End, sp->vxid, "%s", ""); Lck_Delete(&sp->mtx); MPL_Free(pp->mpl_sess, sp); }
void SES_Delete(struct sess *sp, enum sess_close reason, double now) { struct acct *b; struct sesspool *pp; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); pp = sp->sesspool; CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC); AN(pp->pool); if (reason != SC_NULL) SES_Close(sp, reason); assert(sp->fd < 0); if (isnan(now)) now = VTIM_real(); assert(!isnan(sp->t_open)); b = &sp->acct_ses; VSL(SLT_SessClose, sp->vxid, "%s %.3f %ju %ju %ju %ju %ju %ju", sess_close_2str(sp->reason, 0), now - sp->t_open, b->req, b->pipe, b->pass, b->fetch, b->hdrbytes, b->bodybytes); VSL(SLT_End, sp->vxid, "%s", ""); Lck_Delete(&sp->mtx); MPL_Free(pp->mpl_sess, sp); }
void HSH_DeleteObjHead(struct worker *wrk, struct objhead *oh) { AZ(oh->refcnt); assert(VTAILQ_EMPTY(&oh->objcs)); Lck_Delete(&oh->mtx); wrk->stats->n_objecthead--; FREE_OBJ(oh); }
void HSH_DeleteObjHead(struct dstat *ds, struct objhead *oh) { AZ(oh->refcnt); assert(VTAILQ_EMPTY(&oh->objcs)); Lck_Delete(&oh->mtx); ds->n_objecthead--; FREE_OBJ(oh); }
void VBO_Free(struct busyobj **bop) { struct busyobj *bo; AN(bop); bo = *bop; *bop = NULL; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); AZ(bo->refcount); AZ(pthread_cond_destroy(&bo->cond)); Lck_Delete(&bo->mtx); MPL_Free(vbopool, bo); }
vwe_fini(struct waiter *w) { struct vwe *vwe; void *vp; CAST_OBJ_NOTNULL(vwe, w->priv, VWE_MAGIC); Lck_Lock(&vwe->mtx); vwe->die = 1; assert(write(vwe->pipe[1], "Y", 1) == 1); Lck_Unlock(&vwe->mtx); AZ(pthread_join(vwe->thread, &vp)); Lck_Delete(&vwe->mtx); }
static void obj_deleteboc(struct boc **p) { struct boc *boc; AN(p); boc = *p; *p = NULL; Lck_Delete(&boc->mtx); AZ(pthread_cond_destroy(&boc->cond)); if (boc->vary != NULL) free(boc->vary); FREE_OBJ(boc); }
void SES_Rel(struct sess *sp) { int i; struct pool *pp; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); pp = sp->pool; CHECK_OBJ_NOTNULL(pp, POOL_MAGIC); Lck_Lock(&sp->mtx); assert(sp->refcnt > 0); i = --sp->refcnt; Lck_Unlock(&sp->mtx); if (i) return; Lck_Delete(&sp->mtx); MPL_Free(sp->pool->mpl_sess, sp); }
void SES_DeletePool(struct sesspool *sp, struct worker *wrk) { struct sessmem *sm; CHECK_OBJ_NOTNULL(sp, SESSPOOL_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); Lck_Lock(&sp->mtx); while (!VTAILQ_EMPTY(&sp->freelist)) { sm = VTAILQ_FIRST(&sp->freelist); CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC); VTAILQ_REMOVE(&sp->freelist, sm, list); FREE_OBJ(sm); wrk->stats.sessmem_free++; sp->nsess--; } AZ(sp->nsess); Lck_Unlock(&sp->mtx); Lck_Delete(&sp->mtx); FREE_OBJ(sp); }
static void * mpl_guard(void *priv) { struct mempool *mpl; struct memitem *mi = NULL; double mpl_slp __state_variable__(mpl_slp); double last = 0; CAST_OBJ_NOTNULL(mpl, priv, MEMPOOL_MAGIC); mpl_slp = 0.15; // random while (1) { VTIM_sleep(mpl_slp); mpl_slp = 0.814; // random mpl->t_now = VTIM_real(); if (mi != NULL && (mpl->n_pool > mpl->param->max_pool || mi->size < *mpl->cur_size)) { FREE_OBJ(mi); mi = NULL; } if (mi == NULL && mpl->n_pool < mpl->param->min_pool) mi = mpl_alloc(mpl); if (mpl->n_pool < mpl->param->min_pool && mi != NULL) { /* can do */ } else if (mpl->n_pool > mpl->param->max_pool && mi == NULL) { /* can do */ } else if (!VTAILQ_EMPTY(&mpl->surplus)) { /* can do */ } else if (last + .1 * mpl->param->max_age < mpl->t_now) { /* should do */ } else if (mpl->self_destruct) { /* can do */ } else { continue; /* nothing to do */ } mpl_slp = 0.314; // random if (Lck_Trylock(&mpl->mtx)) continue; if (mpl->self_destruct) { AZ(mpl->live); while (1) { if (mi == NULL) { mi = VTAILQ_FIRST(&mpl->list); if (mi != NULL) { mpl->vsc->pool = --mpl->n_pool; VTAILQ_REMOVE(&mpl->list, mi, list); } } if (mi == NULL) { mi = VTAILQ_FIRST(&mpl->surplus); if (mi != NULL) VTAILQ_REMOVE(&mpl->surplus, mi, list); } if (mi == NULL) break; FREE_OBJ(mi); mi = NULL; } VSM_Free(mpl->vsc); Lck_Unlock(&mpl->mtx); Lck_Delete(&mpl->mtx); FREE_OBJ(mpl); break; } if (mpl->n_pool < mpl->param->min_pool && mi != NULL && mi->size >= *mpl->cur_size) { CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); mpl->vsc->pool = ++mpl->n_pool; mi->touched = mpl->t_now; VTAILQ_INSERT_HEAD(&mpl->list, mi, list); mi = NULL; mpl_slp = .01; // random } if (mpl->n_pool > mpl->param->max_pool && mi == NULL) { mi = VTAILQ_FIRST(&mpl->list); CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); mpl->vsc->pool = --mpl->n_pool; mpl->vsc->surplus++; VTAILQ_REMOVE(&mpl->list, mi, list); mpl_slp = .01; // random } if (mi == NULL) { mi = VTAILQ_FIRST(&mpl->surplus); if (mi != NULL) { CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); VTAILQ_REMOVE(&mpl->surplus, mi, list); mpl_slp = .01; // random } } if (mi == NULL && mpl->n_pool > mpl->param->min_pool) { mi = VTAILQ_LAST(&mpl->list, memhead_s); CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); if (mi->touched + mpl->param->max_age < mpl->t_now) { mpl->vsc->pool = --mpl->n_pool; mpl->vsc->timeout++; VTAILQ_REMOVE(&mpl->list, mi, list); mpl_slp = .01; // random } else { mi = NULL; last = mpl->t_now; } } else if (mpl->n_pool <= mpl->param->min_pool) { last = mpl->t_now; } Lck_Unlock(&mpl->mtx); if (mi != NULL) { FREE_OBJ(mi); mi = NULL; } } return (NULL); }