From: Howard Chu Date: Tue, 25 Mar 2003 20:18:50 +0000 (+0000) Subject: Added slap_op_init/destroy, cache Operation structures X-Git-Tag: NO_SLAP_OP_BLOCKS~36 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=fec1c7b54c1662d12ee70ca12ce5984b91be5bf6;p=openldap Added slap_op_init/destroy, cache Operation structures --- diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 2624b98d2f..0b39928890 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -361,6 +361,7 @@ int main( int argc, char **argv ) extops_init(); lutil_passwd_init(); + slap_op_init(); #ifdef SLAPD_MODULES if ( module_init() != 0 ) { @@ -587,6 +588,8 @@ destroy: module_kill(); #endif + slap_op_destroy(); + extops_kill(); stop: diff --git a/servers/slapd/operation.c b/servers/slapd/operation.c index 2a8da886da..499c884eae 100644 --- a/servers/slapd/operation.c +++ b/servers/slapd/operation.c @@ -18,6 +18,26 @@ #include "slapi.h" #endif +static ldap_pvt_thread_mutex_t slap_op_mutex; +static LDAP_STAILQ_HEAD(s_o, slap_op) slap_free_ops; + +void slap_op_init() +{ + ldap_pvt_thread_mutex_init( &slap_op_mutex ); + LDAP_STAILQ_INIT(&slap_free_ops); +} + +void slap_op_destroy() +{ + Operation *o; + + while ( (o = LDAP_STAILQ_FIRST( &slap_free_ops )) != NULL) { + LDAP_STAILQ_REMOVE_HEAD( &slap_free_ops, o_next ); + LDAP_STAILQ_NEXT(o, o_next) = NULL; + ch_free( o ); + } + ldap_pvt_thread_mutex_destroy( &slap_op_mutex ); +} void slap_op_free( Operation *op ) @@ -62,7 +82,10 @@ slap_op_free( Operation *op ) } #endif /* defined( LDAP_SLAPI ) */ - free( (char *) op ); + memset( op, 0, sizeof(Operation) ); + ldap_pvt_thread_mutex_lock( &slap_op_mutex ); + LDAP_STAILQ_INSERT_HEAD( &slap_free_ops, op, o_next ); + ldap_pvt_thread_mutex_unlock( &slap_op_mutex ); } Operation * @@ -75,7 +98,14 @@ slap_op_alloc( { Operation *op; - op = (Operation *) ch_calloc( 1, sizeof(Operation) ); + ldap_pvt_thread_mutex_lock( &slap_op_mutex ); + if (op = LDAP_STAILQ_FIRST( &slap_free_ops )) { + LDAP_STAILQ_REMOVE_HEAD( &slap_free_ops, o_next ); + } + ldap_pvt_thread_mutex_unlock( &slap_op_mutex ); + + if (!op) + op = (Operation *) ch_calloc( 1, sizeof(Operation) ); op->o_ber = ber; op->o_msgid = msgid;