From: Ondřej Kuzník Date: Thu, 25 May 2017 14:04:42 +0000 (+0100) Subject: Free all pending operations on shutdown X-Git-Tag: OPENLDAP_REL_ENG_2_5_1ALPHA~18^2~167 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0b8bd5fc9c48f47be9a99a7f9fb8b1bc3fb074e;p=thirdparty%2Fopenldap.git Free all pending operations on shutdown --- diff --git a/servers/lloadd/backend.c b/servers/lloadd/backend.c index f9226accea..51b5aeb089 100644 --- a/servers/lloadd/backend.c +++ b/servers/lloadd/backend.c @@ -314,12 +314,45 @@ backends_destroy( void ) while ( !LDAP_CIRCLEQ_EMPTY( &b->b_bindconns ) ) { Connection *c = LDAP_CIRCLEQ_FIRST( &b->b_bindconns ); + TAvlnode *root; + long freed; + CONNECTION_LOCK(c); + Debug( LDAP_DEBUG_CONNS, "backends_destroy: " + "destroying bind connection connid=%lu, pending ops=%ld\n", + c->c_connid, c->c_n_ops_executing ); + + root = c->c_ops; + c->c_ops = NULL; + CONNECTION_UNLOCK_INCREF(c); + + freed = tavl_free( root, (AVL_FREE)operation_lost_upstream ); + + CONNECTION_LOCK_DECREF(c); + assert( freed == c->c_n_ops_executing ); + assert( c->c_live ); UPSTREAM_DESTROY(c); } while ( !LDAP_CIRCLEQ_EMPTY( &b->b_conns ) ) { Connection *c = LDAP_CIRCLEQ_FIRST( &b->b_conns ); + TAvlnode *root; + long freed; + CONNECTION_LOCK(c); + Debug( LDAP_DEBUG_CONNS, "backends_destroy: " + "destroying regular connection connid=%lu, pending " + "ops=%ld\n", + c->c_connid, c->c_n_ops_executing ); + + root = c->c_ops; + c->c_ops = NULL; + CONNECTION_UNLOCK_INCREF(c); + + freed = tavl_free( root, (AVL_FREE)operation_lost_upstream ); + + CONNECTION_LOCK_DECREF(c); + assert( freed == c->c_n_ops_executing ); + assert( c->c_live ); UPSTREAM_DESTROY(c); }