diff --git a/servers/lloadd/daemon.c b/servers/lloadd/daemon.c index 15561aa9c4..0a8a6982c1 100644 --- a/servers/lloadd/daemon.c +++ b/servers/lloadd/daemon.c @@ -704,15 +704,13 @@ lloadd_daemon_destroy( void ) return 0; } -static void -destroy_listeners( void ) +void +lloadd_listeners_destroy( void ) { LloadListener *l, **ll = lload_listeners; if ( ll == NULL ) return; - ldap_pvt_thread_join( listener_tid, (void *)NULL ); - while ( (l = *ll++) != NULL ) { lload_listener_free( l ); } @@ -1301,11 +1299,11 @@ lloadd_daemon( struct event_base *daemon_base ) "Main event loop finished: rc=%d\n", rc ); - /* shutdown */ - event_base_loopexit( listener_base, 0 ); + /* Shutdown: */ /* wait for the listener threads to complete */ - destroy_listeners(); + event_base_loopexit( listener_base, 0 ); + ldap_pvt_thread_join( listener_tid, (void *)NULL ); /* Mark upstream connections closing and prevent from opening new ones */ lload_tiers_shutdown(); @@ -1338,7 +1336,6 @@ lloadd_daemon( struct event_base *daemon_base ) lload_tiers_destroy(); clients_destroy( 0 ); - lload_bindconf_free( &bindconf ); evdns_base_free( dnsbase, 0 ); ch_free( daemon_tid ); diff --git a/servers/lloadd/init.c b/servers/lloadd/init.c index 504c1a3cac..42cb67dab3 100644 --- a/servers/lloadd/init.c +++ b/servers/lloadd/init.c @@ -112,11 +112,16 @@ lload_global_destroy( void ) ch_free( lloadd_identity.bv_val ); BER_BVZERO( &lloadd_identity ); } + lload_bindconf_free( &bindconf ); lload_exop_destroy(); ldap_tavl_free( lload_control_actions, (AVL_FREE)lload_restriction_free ); ldap_tavl_free( lload_exop_actions, (AVL_FREE)lload_restriction_free ); + lloadd_listeners_destroy(); + /* All closed at shutdown but tools don't go through shutdown */ + lload_tiers_destroy(); + #ifdef HAVE_TLS if ( lload_tls_backend_ld ) { ldap_unbind_ext( lload_tls_backend_ld, NULL, NULL ); diff --git a/servers/lloadd/proto-lload.h b/servers/lloadd/proto-lload.h index 4b214894c9..3d0e01a3e9 100644 --- a/servers/lloadd/proto-lload.h +++ b/servers/lloadd/proto-lload.h @@ -116,6 +116,7 @@ LDAP_SLAPD_F (void) connections_walk( ldap_pvt_thread_mutex_t *cq_mutex, lload_c LDAP_SLAPD_F (LloadListener *) lload_configure_listener( const char *url, LDAPURLDesc *lud ); LDAP_SLAPD_F (int) lload_open_new_listener( LloadListener *lr ); LDAP_SLAPD_F (int) lloadd_listeners_init( const char *urls ); +LDAP_SLAPD_F (void) lloadd_listeners_destroy( void ); LDAP_SLAPD_F (int) lloadd_daemon_destroy( void ); LDAP_SLAPD_F (int) lloadd_daemon( struct event_base *daemon_base ); LDAP_SLAPD_F (LloadListener **) lloadd_get_listeners( void );