X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=fe87e196a4629a031e221c75bf981834214175eb;hb=7fe91339dfd08d6c4168c8493f5c1f0faca6ba54;hp=92a2b03095c561c384c16296b6163538c0e69ce1;hpb=65cfb058cb16282bb1862c99cb07685489ff81b4;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 92a2b03095..fe87e196a4 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2008 The OpenLDAP Foundation. + * Copyright 1998-2009 The OpenLDAP Foundation. * Portions Copyright 2007 by Howard Chu, Symas Corporation. * All rights reserved. * @@ -1646,7 +1646,7 @@ slapd_daemon_destroy( void ) { connections_destroy(); #ifdef HAVE_WINSOCK - if ( wake_sds[1] != INVALID_SOCKET ) + if ( wake_sds[1] != INVALID_SOCKET && wake_sds[1] != wake_sds[0] ) #endif /* HAVE_WINSOCK */ tcp_close( SLAP_FD2SOCK(wake_sds[1]) ); #ifdef HAVE_WINSOCK @@ -2301,7 +2301,7 @@ slapd_daemon_task( Debug( LDAP_DEBUG_ANY, "daemon: " SLAP_EVENT_FNAME - "failed count %d " + " failed count %d " "err (%d): %s\n", ebadf, err, sock_errstr( err ) ); @@ -2495,7 +2495,7 @@ slapd_daemon_task( #endif /* LDAP_DEBUG */ for ( i = 0; i < ns; i++ ) { - int rc = 1, fd; + int rc = 1, fd, w = 0; if ( SLAP_EVENT_IS_LISTENER( i ) ) { rc = slap_listener_activate( SLAP_EVENT_LISTENER( i ) ); @@ -2513,7 +2513,7 @@ slapd_daemon_task( char c[BUFSIZ]; waking = 0; tcp_read( SLAP_FD2SOCK(wake_sds[0]), c, sizeof(c) ); - break; + continue; } if ( SLAP_EVENT_IS_WRITE( i ) ) { @@ -2522,6 +2522,7 @@ slapd_daemon_task( fd, 0, 0 ); SLAP_EVENT_CLR_WRITE( i ); + w = 1; /* * NOTE: it is possible that the connection was closed @@ -2541,9 +2542,17 @@ slapd_daemon_task( SLAP_EVENT_CLR_READ( i ); connection_read_activate( fd ); - } else { + } else if ( !w ) { Debug( LDAP_DEBUG_CONNS, "daemon: hangup on %d\n", fd, 0, 0 ); + if ( SLAP_SOCK_IS_ACTIVE( fd )) { +#ifdef HAVE_EPOLL + /* Don't keep reporting the hangup + */ + SLAP_EPOLL_SOCK_SET( fd, EPOLLET ); +#endif + connection_hangup( fd ); + } } } } @@ -2582,9 +2591,12 @@ slapd_daemon_task( connections_shutdown(); } - Debug( LDAP_DEBUG_ANY, - "slapd shutdown: waiting for %d threads to terminate\n", - ldap_pvt_thread_pool_backload( &connection_pool ), 0, 0 ); + if ( LogTest( LDAP_DEBUG_ANY )) { + int t = ldap_pvt_thread_pool_backload( &connection_pool ); + Debug( LDAP_DEBUG_ANY, + "slapd shutdown: waiting for %d operations/tasks to finish\n", + t, 0, 0 ); + } ldap_pvt_thread_pool_destroy( &connection_pool, 1 ); free( slap_listeners );