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