#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 )
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
}
#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 *
{
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;