Commit 8941ae92 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Reference count directors.

(2nd part of #3599)
parent 0d68e21d
......@@ -36,6 +36,7 @@
struct vcldir {
unsigned magic;
#define VCLDIR_MAGIC 0xbf726c7d
int refcnt;
struct lock dlck;
struct director *dir;
struct vcl *vcl;
......
......@@ -197,6 +197,7 @@ VRT_AddDirector(VRT_CTX, const struct vdi_methods *m, void *priv,
vdir->admin_health = VDI_AH_AUTO;
vdir->health_changed = VTIM_real();
vdir->refcnt++;
Lck_New(&vdir->dlck, lck_director);
vdir->dir->mtx = &vdir->dlck;
......@@ -238,6 +239,11 @@ VRT_DelDirector(VCL_BACKEND *bp)
vcl = vdir->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
Lck_Lock(d->mtx);
assert(vdir->refcnt == 1);
--vdir->refcnt;
Lck_Unlock(d->mtx);
Lck_Lock(&vcl_mtx);
temp = vcl->temp;
VTAILQ_REMOVE(&vcl->director_list, vdir, list);
......@@ -256,6 +262,22 @@ VRT_Assign_Backend(VCL_BACKEND *dst, VCL_BACKEND src)
{
AN(dst);
CHECK_OBJ_ORNULL((*dst), DIRECTOR_MAGIC);
CHECK_OBJ_ORNULL(src, DIRECTOR_MAGIC);
if (*dst != NULL) {
CHECK_OBJ_NOTNULL((*dst)->vdir, VCLDIR_MAGIC);
Lck_Lock((*dst)->mtx);
assert((*dst)->vdir->refcnt > 0);
--(*dst)->vdir->refcnt;
Lck_Unlock((*dst)->mtx);
}
if (src != NULL) {
CHECK_OBJ_NOTNULL(src->vdir, VCLDIR_MAGIC);
Lck_Lock(src->mtx);
assert(src->vdir->refcnt > 0);
src->vdir->refcnt++;
Lck_Unlock(src->mtx);
}
*dst = src;
}
......
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