[master] 5e5c39cf8 Move HSH_DeleteObjHead into the hash deref methods

Martin Blix Grydeland martin at varnish-software.com
Tue Dec 4 13:46:08 UTC 2018


commit 5e5c39cf82843ce294690012b270a0ae47c5938e
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Nov 20 12:48:49 2018 +0100

    Move HSH_DeleteObjHead into the hash deref methods
    
    Move the clean up call to HSH_DeleteObjHead inside of the hash deref
    methods that require it, instead of having the outside (single) caller do
    it based off the return value. This just cleans up and makes the logic
    more transparent.

diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index d1491d592..18bbd7a07 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -983,7 +983,6 @@ HSH_DerefObjHead(struct worker *wrk, struct objhead **poh)
 {
 	struct objhead *oh;
 	struct rush rush;
-	int r;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	TAKE_OBJ_NOTNULL(oh, poh, OBJHEAD_MAGIC);
@@ -1016,10 +1015,7 @@ HSH_DerefObjHead(struct worker *wrk, struct objhead **poh)
 	Lck_Unlock(&oh->mtx);
 
 	assert(oh->refcnt > 0);
-	r = hash->deref(oh);
-	if (!r)
-		HSH_DeleteObjHead(wrk, oh);
-	return (r);
+	return (hash->deref(wrk, oh));
 }
 
 void
diff --git a/bin/varnishd/hash/hash_classic.c b/bin/varnishd/hash/hash_classic.c
index 3440b9bd2..d3303c875 100644
--- a/bin/varnishd/hash/hash_classic.c
+++ b/bin/varnishd/hash/hash_classic.c
@@ -172,7 +172,7 @@ hcl_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
  */
 
 static int v_matchproto_(hash_deref_f)
-hcl_deref(struct objhead *oh)
+hcl_deref(struct worker *wrk, struct objhead *oh)
 {
 	struct hcl_hd *hp;
 	int ret;
@@ -187,6 +187,8 @@ hcl_deref(struct objhead *oh)
 	} else
 		ret = 1;
 	Lck_Unlock(&hp->mtx);
+	if (!ret)
+		HSH_DeleteObjHead(wrk, oh);
 	return (ret);
 }
 
diff --git a/bin/varnishd/hash/hash_critbit.c b/bin/varnishd/hash/hash_critbit.c
index c673595b2..1c453148f 100644
--- a/bin/varnishd/hash/hash_critbit.c
+++ b/bin/varnishd/hash/hash_critbit.c
@@ -347,13 +347,15 @@ hcb_start(void)
 }
 
 static int v_matchproto_(hash_deref_f)
-hcb_deref(struct objhead *oh)
+hcb_deref(struct worker *wrk, struct objhead *oh)
 {
+	int r;
 
+	(void)wrk;
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 	Lck_Lock(&oh->mtx);
 	assert(oh->refcnt > 0);
-	oh->refcnt--;
+	r = --oh->refcnt;
 	if (oh->refcnt == 0) {
 		Lck_Lock(&hcb_mtx);
 		hcb_delete(&hcb_root, oh);
@@ -364,7 +366,7 @@ hcb_deref(struct objhead *oh)
 #ifdef PHK
 	fprintf(stderr, "hcb_defef %d %d <%s>\n", __LINE__, r, oh->hash);
 #endif
-	return (1);
+	return (r);
 }
 
 static struct objhead * v_matchproto_(hash_lookup_f)
diff --git a/bin/varnishd/hash/hash_simple_list.c b/bin/varnishd/hash/hash_simple_list.c
index 4c1e9025a..643148ed0 100644
--- a/bin/varnishd/hash/hash_simple_list.c
+++ b/bin/varnishd/hash/hash_simple_list.c
@@ -108,7 +108,7 @@ hsl_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
  */
 
 static int v_matchproto_(hash_deref_f)
-hsl_deref(struct objhead *oh)
+hsl_deref(struct worker *wrk, struct objhead *oh)
 {
 	int ret;
 
@@ -119,6 +119,8 @@ hsl_deref(struct objhead *oh)
 	} else
 		ret = 1;
 	Lck_Unlock(&hsl_mtx);
+	if (!ret)
+		HSH_DeleteObjHead(wrk, oh);
 	return (ret);
 }
 
diff --git a/bin/varnishd/hash/hash_slinger.h b/bin/varnishd/hash/hash_slinger.h
index 6c17b8374..0ff95cca2 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -36,7 +36,7 @@ typedef void hash_start_f(void);
 typedef void hash_prep_f(struct worker *);
 typedef struct objhead *hash_lookup_f(struct worker *, const void *digest,
     struct objhead **);
-typedef int hash_deref_f(struct objhead *);
+typedef int hash_deref_f(struct worker *, struct objhead *);
 
 struct hash_slinger {
 	unsigned		magic;


More information about the varnish-commit mailing list