- Fix that unbound-control reload frees the rrset keys and returns

the memory pages to the system.


git-svn-id: file:///svn/unbound/trunk@4669 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2018-05-01 14:00:06 +00:00
parent 913d4537f4
commit 85bf0bd994
4 changed files with 45 additions and 10 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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.