diff options
author | Werner Koch <wk@gnupg.org> | 2012-12-28 19:26:59 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2013-03-20 09:50:17 +0100 |
commit | 2739834206f23833161898a73427b8a9c6d5d26d (patch) | |
tree | 03714abe221b38f91b2dc1a8df85d20f51b08c57 /g10/kbnode.c | |
parent | kbx: Remove unused macro. (diff) | |
download | gnupg2-2739834206f23833161898a73427b8a9c6d5d26d.tar.xz gnupg2-2739834206f23833161898a73427b8a9c6d5d26d.zip |
Add code to allow for late memory cleanup.
* common/init.c (mem_cleanup_item_t): New.
(run_mem_cleanup): New.
(_init_common_subsystems): Add an atexit for it.
(register_mem_cleanup_func): New.
* g10/kbnode.c (cleanup_registered): New.
(release_unused_nodes): New.
(alloc_node): Call register_mem_cleanup_func.
--
It is often time consuming to figure out whether still allocated
memory at process termination is fine (e.g. a cache) or a problem. To
help for that register_mem_cleanup_func may now be used to cleanup
such memory. The run time of the program will be longer; if that
turns out to be a problem we can change the code to only run in
debugging mode.
Diffstat (limited to 'g10/kbnode.c')
-rw-r--r-- | g10/kbnode.c | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/g10/kbnode.c b/g10/kbnode.c index 1a8b91e43..d4907408b 100644 --- a/g10/kbnode.c +++ b/g10/kbnode.c @@ -31,35 +31,58 @@ #define USE_UNUSED_NODES 1 +static int cleanup_registered; static KBNODE unused_nodes; -static KBNODE -alloc_node(void) +#if USE_UNUSED_NODES +static void +release_unused_nodes (void) { - KBNODE n; + while (unused_nodes) + { + kbnode_t next = unused_nodes->next; + xfree (unused_nodes); + unused_nodes = next; + } +} +#endif /*USE_UNUSED_NODES*/ - n = unused_nodes; - if( n ) - unused_nodes = n->next; - else - n = xmalloc( sizeof *n ); - n->next = NULL; - n->pkt = NULL; - n->flag = 0; - n->private_flag=0; - n->recno = 0; - return n; + +static kbnode_t +alloc_node (void) +{ + kbnode_t n; + + n = unused_nodes; + if (n) + unused_nodes = n->next; + else + { + if (!cleanup_registered) + { + cleanup_registered = 1; + register_mem_cleanup_func (release_unused_nodes); + } + n = xmalloc (sizeof *n); + } + n->next = NULL; + n->pkt = NULL; + n->flag = 0; + n->private_flag=0; + n->recno = 0; + return n; } static void free_node( KBNODE n ) { - if( n ) { + if (n) + { #if USE_UNUSED_NODES - n->next = unused_nodes; - unused_nodes = n; + n->next = unused_nodes; + unused_nodes = n; #else - xfree( n ); + xfree (n); #endif } } |