aboutsummaryrefslogtreecommitdiffstats
path: root/g10/kbnode.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1998-10-12 20:16:38 +0000
committerWerner Koch <[email protected]>1998-10-12 20:16:38 +0000
commit8477407e794951c686e3afe1d13035abd0153d9f (patch)
treea062f99923861fe7c55d5cc2ff3cf04daba8c8e0 /g10/kbnode.c
parenta new release (diff)
downloadgnupg-8477407e794951c686e3afe1d13035abd0153d9f.tar.gz
gnupg-8477407e794951c686e3afe1d13035abd0153d9f.zip
backup
Diffstat (limited to 'g10/kbnode.c')
-rw-r--r--g10/kbnode.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/g10/kbnode.c b/g10/kbnode.c
index 428768105..18b16d0bd 100644
--- a/g10/kbnode.c
+++ b/g10/kbnode.c
@@ -28,12 +28,20 @@
#include "packet.h"
#include "keydb.h"
+#define USE_UNUSED_NODES 1
+static KBNODE unused_nodes;
KBNODE
new_kbnode( PACKET *pkt )
{
- KBNODE n = m_alloc( sizeof *n );
+ KBNODE n;
+
+ n = unused_nodes;
+ if( n )
+ unused_nodes = n->next;
+ else
+ n = m_alloc( sizeof *n );
n->next = NULL;
n->pkt = pkt;
n->flag = 0;
@@ -45,7 +53,13 @@ new_kbnode( PACKET *pkt )
KBNODE
clone_kbnode( KBNODE node )
{
- KBNODE n = m_alloc( sizeof *n );
+ KBNODE n;
+
+ n = unused_nodes;
+ if( n )
+ unused_nodes = n->next;
+ else
+ n = m_alloc( sizeof *n );
n->next = NULL;
n->pkt = node->pkt;
n->flag = 0;
@@ -61,9 +75,16 @@ release_kbnode( KBNODE n )
while( n ) {
n2 = n->next;
- if( !(n->private_flag & 2) )
+ if( !(n->private_flag & 2) ) {
free_packet( n->pkt );
+ m_free( n->pkt );
+ }
+ #if USE_UNUSED_NODES
+ n->next = unused_nodes;
+ unused_nodes = n;
+ #else
m_free( n );
+ #endif
n = n2;
}
}
@@ -230,9 +251,16 @@ commit_kbnode( KBNODE *root )
*root = nl = n->next;
else
nl->next = n->next;
- if( !(n->private_flag & 2) )
+ if( !(n->private_flag & 2) ) {
free_packet( n->pkt );
+ m_free( n->pkt );
+ }
+ #if USE_UNUSED_NODES
+ n->next = unused_nodes;
+ unused_nodes = n;
+ #else
m_free( n );
+ #endif
changed = 1;
}
else