/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2009 The OpenLDAP Foundation.
+ * Copyright 2009-2010 The OpenLDAP Foundation.
* Portions copyright 2009 Symas Corporation.
* All rights reserved.
*
/* There is only one conn table for all overlay instances */
static sort_op **sort_conns;
static ldap_pvt_thread_mutex_t sort_conns_mutex;
+static int ov_count;
static const char *debug_header = "sssvlv";
static int sss_cid;
be = op->o_bd;
for ( i=0; i<j; i++ ) {
sort_node *sn = cur_node->avl_data;
-
+
+ if ( slapd_shutdown ) break;
+
op->o_bd = select_backend( &sn->sn_dn, 0 );
e = NULL;
rc = be_entry_get_rw( op, &sn->sn_dn, NULL, NULL, 0, &e );
while ( cur_node && rs->sr_nentries < so->so_page_size ) {
sort_node *sn = cur_node->avl_data;
+ if ( slapd_shutdown ) break;
+
next_node = tavl_next( cur_node, TAVL_DIR_RIGHT );
op->o_bd = select_backend( &sn->sn_dn, 0 );
op->o_tmpmemctx );
/* Install serversort response callback to handle a new search */
if ( ps || vc ) {
- so = ch_malloc( sizeof(sort_op));
+ so = ch_calloc( 1, sizeof(sort_op));
} else {
- so = op->o_tmpalloc( sizeof(sort_op), op->o_tmpmemctx );
+ so = op->o_tmpcalloc( 1, sizeof(sort_op), op->o_tmpmemctx );
}
sort_conns[op->o_conn->c_conn_idx] = so;
so->so_vlv = op->o_ctrlflag[vlv_cid];
so->so_vlv_target = 0;
so->so_vlv_rc = 0;
+ } else {
+ so->so_vlv = SLAP_CONTROL_NONE;
}
}
so->so_vcontext = (unsigned long)so;
sort_conns = ch_calloc( sizeof(sort_op *), dtblsize + 1 );
sort_conns++;
}
+ ov_count++;
return LDAP_SUCCESS;
}
slap_overinst *on = (slap_overinst *)be->bd_info;
sssvlv_info *si = (sssvlv_info *)on->on_bi.bi_private;
+ ov_count--;
+ if ( !ov_count && sort_conns) {
+ sort_conns--;
+ ch_free(sort_conns);
+ ldap_pvt_thread_mutex_destroy( &sort_conns_mutex );
+ }
+
if ( si ) {
ch_free( si );
on->on_bi.bi_private = NULL;
if ( rc == LDAP_SUCCESS ) {
rc = overlay_register( &sssvlv );
if ( rc != LDAP_SUCCESS ) {
- fprintf( stderr, "Failed to register server side sort overlay\n" );
+ Debug( LDAP_DEBUG_ANY, "Failed to register server side sort overlay\n", 0, 0, 0 );
}
}
else {
- fprintf( stderr, "Failed to register control %d\n", rc );
+ Debug( LDAP_DEBUG_ANY, "Failed to register control %d\n", rc, 0, 0 );
}
return rc;