mirror of
https://github.com/NLnetLabs/unbound.git
synced 2024-09-21 06:37:08 +00:00
- 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:
parent
913d4537f4
commit
85bf0bd994
@ -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;
|
||||
|
@ -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.
|
||||
|
42
util/alloc.c
42
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;
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user