]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2116. [bug] 'rndc reload' could cause the cache to continually
authorMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 06:34:14 +0000 (06:34 +0000)
committerMark Andrews <marka@isc.org>
Thu, 7 Dec 2006 06:34:14 +0000 (06:34 +0000)
                        be cleaned. [RT #16401]

CHANGES
lib/isc/mem.c

diff --git a/CHANGES b/CHANGES
index e9aa3c0d8a7a8d8b7fba3a6235bb227a833d274a..ea8ebb2c55cf9b216b2541e6f1d85b5b4dea6dff 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2116.  [bug]           'rndc reload' could cause the cache to continually
+                       be cleaned. [RT #16401]
+
 2115.  [bug]           'rndc reconfig' could trigger a INSIST if the
                        number of masters for a zone was reduced. [RT #16444]
 
index cf4c5ecbbfe6b57eb195f4a6a492157de1371653..e6a6997af0b3013e01c1e1dc37cc0d4d6c0f3306 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: mem.c,v 1.98.2.11 2005/03/16 00:57:43 marka Exp $ */
+/* $Id: mem.c,v 1.98.2.12 2006/12/07 06:34:14 marka Exp $ */
 
 #include <config.h>
 
@@ -297,7 +297,7 @@ delete_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size,
 static inline size_t
 rmsize(size_t size) {
        /*
-        * round down to ALIGNMENT_SIZE
+        * round down to ALIGNMENT_SIZE
         */
        return (size & (~(ALIGNMENT_SIZE - 1)));
 }
@@ -1310,19 +1310,30 @@ isc_mem_inuse(isc_mem_t *ctx) {
 
 void
 isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
-                 size_t hiwater, size_t lowater)
+                size_t hiwater, size_t lowater)
 {
+       isc_boolean_t callwater = ISC_FALSE;
+       isc_mem_water_t oldwater;
+       void *oldwater_arg;
+
        REQUIRE(VALID_CONTEXT(ctx));
        REQUIRE(hiwater >= lowater);
 
        LOCK(&ctx->lock);
+       oldwater = ctx->water;
+       oldwater_arg = ctx->water_arg;
        if (water == NULL) {
+               callwater = ctx->hi_called;
                ctx->water = NULL;
                ctx->water_arg = NULL;
                ctx->hi_water = 0;
                ctx->lo_water = 0;
                ctx->hi_called = ISC_FALSE;
        } else {
+               if (ctx->hi_called &&
+                   (ctx->water != water || ctx->water_arg != water_arg ||
+                    ctx->inuse < lowater || lowater == 0))
+                       callwater = ISC_TRUE;
                ctx->water = water;
                ctx->water_arg = water_arg;
                ctx->hi_water = hiwater;
@@ -1330,6 +1341,9 @@ isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
                ctx->hi_called = ISC_FALSE;
        }
        UNLOCK(&ctx->lock);
+
+       if (callwater && oldwater != NULL)
+               (oldwater)(oldwater_arg, ISC_MEM_LOWATER);
 }
 
 /*