
phk at varnish-cache
Mar 20, 2012, 3:57 AM
Post #1 of 1
(73 views)
Permalink
|
|
[master] 4edc10c The busyobj refcount must be protected by the oh->mtx just like the oc->busyobj pointer.
|
|
commit 4edc10c5d460d38c5a2cecffa572e0001b180ebb Author: Poul-Henning Kamp <phk [at] FreeBSD> Date: Tue Mar 20 10:56:04 2012 +0000 The busyobj refcount must be protected by the oh->mtx just like the oc->busyobj pointer. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index f337f66..9abf2da 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -725,7 +725,6 @@ double BAN_Time(const struct ban *ban); /* cache_busyobj.c */ void VBO_Init(void); struct busyobj *VBO_GetBusyObj(struct worker *wrk); -void VBO_RefBusyObj(struct busyobj *busyobj); void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj); void VBO_Free(struct busyobj **vbo); diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c index 79b55ed..0489734 100644 --- a/bin/varnishd/cache/cache_busyobj.c +++ b/bin/varnishd/cache/cache_busyobj.c @@ -138,20 +138,10 @@ VBO_GetBusyObj(struct worker *wrk) } void -VBO_RefBusyObj(struct busyobj *bo) -{ - - CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); - Lck_Lock(&bo->mtx); - assert(bo->refcount > 0); - bo->refcount++; - Lck_Unlock(&bo->mtx); -} - -void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) { struct busyobj *bo; + struct objcore *oc; unsigned r; CHECK_OBJ_ORNULL(wrk, WORKER_MAGIC); @@ -160,17 +150,28 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) *pbo = NULL; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_ORNULL(bo->fetch_obj, OBJECT_MAGIC); - Lck_Lock(&bo->mtx); - assert(bo->refcount > 0); - r = --bo->refcount; - Lck_Unlock(&bo->mtx); + if (bo->fetch_obj != NULL && bo->fetch_obj->objcore != NULL) { + oc = bo->fetch_obj->objcore; + CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); + CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC); + Lck_Lock(&oc->objhead->mtx); + assert(bo->refcount > 0); + r = --bo->refcount; + Lck_Unlock(&oc->objhead->mtx); + } else { + oc = NULL; + Lck_Lock(&bo->mtx); + assert(bo->refcount > 0); + r = --bo->refcount; + Lck_Unlock(&bo->mtx); + } if (r) return; VSL_Flush(bo->vsl, 0); - if (bo->fetch_obj != NULL && bo->fetch_obj->objcore != NULL) { + if (oc != NULL) { AN(wrk); (void)HSH_Deref(&wrk->stats, NULL, &bo->fetch_obj); } _______________________________________________ varnish-commit mailing list varnish-commit [at] varnish-cache https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit
|