static int event_warm(VRT_CTX) { VSL(SLT_Debug, 0, "%s: VCL_EVENT_WARM", VCL_Name(ctx->vcl)); if (cache_param->max_esi_depth == 42) { VSB_printf(ctx->msg, "max_esi_depth is not the answer."); return (-1); } VRT_ref_vcl(ctx); return (0); }
static int event_warm(VRT_CTX, const struct vmod_priv *priv) { struct priv_vcl *priv_vcl; char buf[32]; VSL(SLT_Debug, 0, "%s: VCL_EVENT_WARM", VCL_Name(ctx->vcl)); AN(ctx->msg); if (cache_param->max_esi_depth == 42) { VSB_printf(ctx->msg, "max_esi_depth is not the answer."); return (-1); } CAST_OBJ_NOTNULL(priv_vcl, priv->priv, PRIV_VCL_MAGIC); AZ(priv_vcl->vcl); AZ(priv_vcl->vclref); bprintf(buf, "vmod-debug ref on %s", VCL_Name(ctx->vcl)); priv_vcl->vcl = ctx->vcl; priv_vcl->vclref = VRT_ref_vcl(ctx, buf); return (0); }
static int event_cold(VRT_CTX) { pthread_t thread; VSL(SLT_Debug, 0, "%s: VCL_EVENT_COLD", VCL_Name(ctx->vcl)); if (vcl_release_delay == 0.0) { VRT_rel_vcl(ctx); return (0); } AZ(pthread_create(&thread, NULL, cooldown_thread, ctx->vcl)); AZ(pthread_detach(thread)); return (0); }
static int event_cold(VRT_CTX, const struct vmod_priv *priv) { pthread_t thread; struct priv_vcl *priv_vcl; CAST_OBJ_NOTNULL(priv_vcl, priv->priv, PRIV_VCL_MAGIC); AN(priv_vcl->vcl); AN(priv_vcl->vclref); VSL(SLT_Debug, 0, "%s: VCL_EVENT_COLD", VCL_Name(ctx->vcl)); if (vcl_release_delay == 0.0) { VRT_rel_vcl(ctx, &priv_vcl->vclref); priv_vcl->vcl = NULL; return (0); } AZ(pthread_create(&thread, NULL, cooldown_thread, priv_vcl)); AZ(pthread_detach(thread)); return (0); }
VCL_BACKEND VRT_AddDirector(VRT_CTX, const struct vdi_methods *m, void *priv, const char *fmt, ...) { struct vsb *vsb; struct vcl *vcl; struct vcldir *vdir; struct director *d; va_list ap; int i; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(m, VDI_METHODS_MAGIC); AN(fmt); vcl = ctx->vcl; CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC); AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl)); if (vcl->temp == VCL_TEMP_COOLING) { AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl)); return (NULL); } ALLOC_OBJ(d, DIRECTOR_MAGIC); AN(d); ALLOC_OBJ(vdir, VCLDIR_MAGIC); AN(vdir); vdir->dir = d; d->vdir = vdir; vdir->methods = m; d->priv = priv; vsb = VSB_new_auto(); AN(vsb); VSB_printf(vsb, "%s.", VCL_Name(vcl)); i = VSB_len(vsb); va_start(ap, fmt); VSB_vprintf(vsb, fmt, ap); va_end(ap); AZ(VSB_finish(vsb)); REPLACE((vdir->cli_name), VSB_data(vsb)); VSB_destroy(&vsb); d->vcl_name = vdir->cli_name + i; vdir->vcl = vcl; d->sick = 0; vdir->admin_health = VDI_AH_PROBE; vdir->health_changed = VTIM_real(); Lck_Lock(&vcl_mtx); VTAILQ_INSERT_TAIL(&vcl->director_list, vdir, list); Lck_Unlock(&vcl_mtx); if (VCL_WARM(vcl)) /* Only when adding backend to already warm VCL */ VDI_Event(d, VCL_EVENT_WARM); else if (vcl->temp != VCL_TEMP_INIT) WRONG("Dynamic Backends can only be added to warm VCLs"); AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl)); return (d); }