]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/operation.c
filter_candidate tweaks, search_stack tweaks
[openldap] / servers / slapd / operation.c
index 42f52b2c71dc619c01d2a6d7fa5e45893d484541..95e28288b5882ab35f5b0b1596b94d8f410d9107 100644 (file)
 #include <ac/socket.h>
 
 #include "slap.h"
+
+#ifdef LDAP_SLAPI
 #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(void)
+{
+       ldap_pvt_thread_mutex_init( &slap_op_mutex );
+       LDAP_STAILQ_INIT(&slap_free_ops);
+}
 
+void slap_op_destroy(void)
+{
+       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 )
@@ -34,7 +57,7 @@ slap_op_free( Operation *op )
                free( op->o_authmech.bv_val );
        }
        if ( op->o_ctrls != NULL ) {
-               ldap_controls_free( op->o_ctrls );
+               slap_free_ctrls( op, op->o_ctrls );
        }
 
 #ifdef LDAP_CONNECTIONLESS
@@ -59,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 *
@@ -72,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;