}
void
-clients_destroy( void )
+clients_destroy( int gentle )
{
ldap_pvt_thread_mutex_lock( &clients_mutex );
- while ( !LDAP_CIRCLEQ_EMPTY( &clients ) ) {
- LloadConnection *c = LDAP_CIRCLEQ_FIRST( &clients );
-
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
- CONNECTION_LOCK(c);
- /* We have shut down all processing, a dying connection connection
- * should have been reclaimed by now! */
- assert( c->c_live );
- /* Upstream connections have already been destroyed, there should be no
- * ops left */
- assert( !c->c_ops );
- CONNECTION_DESTROY(c);
- ldap_pvt_thread_mutex_lock( &clients_mutex );
- }
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
-}
-
-void
-clients_walk( CONNCB apply, void *argv )
-{
- LloadConnection *c;
- ldap_pvt_thread_mutex_lock( &clients_mutex );
- if ( LDAP_CIRCLEQ_EMPTY( &clients ) ) {
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
- return;
- }
-
- /* Todo is it possible to do this without holding this lock? */
- LDAP_CIRCLEQ_FOREACH ( c, &clients, c_next ) {
- apply( c, argv );
- }
+ connections_walk(
+ &clients_mutex, &clients, lload_connection_close, &gentle );
ldap_pvt_thread_mutex_unlock( &clients_mutex );
}
ldap_pvt_thread_mutex_unlock( &b->b_mutex );
}
+ /* Do the same for clients */
+ clients_destroy( 1 );
+
for ( i = 0; i < lload_daemon_threads; i++ ) {
/*
* https://github.com/libevent/libevent/issues/623
#endif
lload_backends_destroy();
- clients_destroy();
+ clients_destroy( 0 );
lload_bindconf_free( &bindconf );
evdns_base_free( dnsbase, 0 );
mp_parent = e_parent->e_private;
arg.ms = (monitor_subsys_t *)mp_parent->mp_info;
- clients_walk( lload_monitor_in_conn_entry, &arg );
+ ldap_pvt_thread_mutex_lock( &clients_mutex );
+ connections_walk(
+ &clients_mutex, &clients, lload_monitor_in_conn_entry, &arg );
+ ldap_pvt_thread_mutex_unlock( &clients_mutex );
return 0;
}
Debug( LDAP_DEBUG_TRACE, "lload_monitor_update_global_stats: "
"updating stats\n" );
+
/* count incoming connections */
- clients_walk( lload_monitor_incoming_count, &tmp_stats );
+ ldap_pvt_thread_mutex_lock( &clients_mutex );
+ connections_walk( &clients_mutex, &clients, lload_monitor_incoming_count,
+ &tmp_stats );
+ ldap_pvt_thread_mutex_unlock( &clients_mutex );
LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
ldap_pvt_thread_mutex_lock( &b->b_mutex );
LDAP_SLAPD_F (LloadConnection *) client_init( ber_socket_t s, LloadListener *url, const char *peername, struct event_base *base, int use_tls );
LDAP_SLAPD_F (void) client_reset( LloadConnection *c );
LDAP_SLAPD_F (void) client_destroy( LloadConnection *c );
-LDAP_SLAPD_F (void) clients_destroy( void );
-LDAP_SLAPD_F (void) clients_walk( CONNCB apply, void *argv );
+LDAP_SLAPD_F (void) clients_destroy( int gentle );
/*
* config.c