diff --git a/daemon/daemon.c b/daemon/daemon.c index 85ae1e0a1..6820e1181 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -704,6 +704,7 @@ daemon_cleanup(struct daemon* daemon) free(daemon->workers); daemon->workers = NULL; daemon->num = 0; + alloc_clear_special(&daemon->superalloc); #ifdef USE_DNSTAP dt_delete(daemon->dtenv); daemon->dtenv = NULL; diff --git a/doc/Changelog b/doc/Changelog index 62534161c..ac8c00c9c 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +1 May 2018: Wouter + - Fix that unbound-control reload frees the rrset keys and returns + the memory pages to the system. + 30 April 2018: Wouter - Fix spelling error in man page and note defaults as no instead of off. diff --git a/util/alloc.c b/util/alloc.c index 2c6e1a23f..908b1f423 100644 --- a/util/alloc.c +++ b/util/alloc.c @@ -126,10 +126,40 @@ alloc_init(struct alloc_cache* alloc, struct alloc_cache* super, } } +/** free the special list */ +static void +alloc_clear_special_list(struct alloc_cache* alloc) +{ + alloc_special_type* p, *np; + /* free */ + p = alloc->quar; + while(p) { + np = alloc_special_next(p); + /* deinit special type */ + lock_rw_destroy(&p->entry.lock); + free(p); + p = np; + } +} + +void +alloc_clear_special(struct alloc_cache* alloc) +{ + if(!alloc->super) { + lock_quick_lock(&alloc->lock); + } + alloc_clear_special_list(alloc); + alloc->quar = 0; + alloc->num_quar = 0; + if(!alloc->super) { + lock_quick_unlock(&alloc->lock); + } +} + void alloc_clear(struct alloc_cache* alloc) { - alloc_special_type* p, *np; + alloc_special_type* p; struct regional* r, *nr; if(!alloc) return; @@ -147,15 +177,7 @@ alloc_clear(struct alloc_cache* alloc) alloc->super->num_quar += alloc->num_quar; lock_quick_unlock(&alloc->super->lock); } else { - /* free */ - p = alloc->quar; - while(p) { - np = alloc_special_next(p); - /* deinit special type */ - lock_rw_destroy(&p->entry.lock); - free(p); - p = np; - } + alloc_clear_special_list(alloc); } alloc->quar = 0; alloc->num_quar = 0; diff --git a/util/alloc.h b/util/alloc.h index 9839a4550..ee03b074e 100644 --- a/util/alloc.h +++ b/util/alloc.h @@ -115,6 +115,14 @@ void alloc_init(struct alloc_cache* alloc, struct alloc_cache* super, */ void alloc_clear(struct alloc_cache* alloc); +/** + * Free the special alloced items. The rrset and message caches must be + * empty, there must be no more references to rrset pointers into the + * rrset cache. + * @param alloc: the special allocs are freed. + */ +void alloc_clear_special(struct alloc_cache* alloc); + /** * Get a new special_type element. * @param alloc: where to alloc it.