mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Use lutil_pair(), WAKE_LISTENER now uses this socket.
This commit is contained in:
parent
c057653881
commit
0319dcad17
@ -42,37 +42,20 @@ typedef struct slap_listener {
|
|||||||
|
|
||||||
Listener **slap_listeners = NULL;
|
Listener **slap_listeners = NULL;
|
||||||
|
|
||||||
|
static int sel_exit_fds[2];
|
||||||
|
|
||||||
|
#define WAKE_LISTENER(w) \
|
||||||
|
do { if (w) tcp_write( sel_exit_fds[1], "0", 1 ); } while(0)
|
||||||
|
|
||||||
#ifdef HAVE_WINSOCK2
|
#ifdef HAVE_WINSOCK2
|
||||||
/* in nt_main.c */
|
/* in nt_main.c */
|
||||||
extern ldap_pvt_thread_cond_t started_event;
|
extern ldap_pvt_thread_cond_t started_event;
|
||||||
|
|
||||||
/* forward reference */
|
|
||||||
static void hit_socket(void);
|
|
||||||
/* In wsa_err.c */
|
|
||||||
char *WSAGetLastErrorString();
|
|
||||||
static ldap_pvt_thread_t hit_tid;
|
|
||||||
|
|
||||||
#define WAKE_LISTENER(w) \
|
|
||||||
do {\
|
|
||||||
if( w ) {\
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );\
|
|
||||||
hit_socket(); \
|
|
||||||
}\
|
|
||||||
} while(0)
|
|
||||||
#else
|
|
||||||
#define WAKE_LISTENER(w) \
|
|
||||||
do {\
|
|
||||||
if( w ) {\
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );\
|
|
||||||
}\
|
|
||||||
} while(0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_WINSOCK
|
#ifndef HAVE_WINSOCK
|
||||||
static
|
static
|
||||||
#endif
|
#endif
|
||||||
volatile sig_atomic_t slapd_shutdown = 0;
|
volatile sig_atomic_t slapd_shutdown = 0;
|
||||||
static int sel_exit_fd;
|
|
||||||
|
|
||||||
static ldap_pvt_thread_t listener_tid;
|
static ldap_pvt_thread_t listener_tid;
|
||||||
static volatile sig_atomic_t slapd_listener = 0;
|
static volatile sig_atomic_t slapd_listener = 0;
|
||||||
@ -125,7 +108,6 @@ static void slapd_add(ber_socket_t s) {
|
|||||||
*/
|
*/
|
||||||
void slapd_remove(ber_socket_t s, int wake) {
|
void slapd_remove(ber_socket_t s, int wake) {
|
||||||
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
||||||
WAKE_LISTENER(wake);
|
|
||||||
|
|
||||||
Debug( LDAP_DEBUG_CONNS, "daemon: removing %ld%s%s\n",
|
Debug( LDAP_DEBUG_CONNS, "daemon: removing %ld%s%s\n",
|
||||||
(long) s,
|
(long) s,
|
||||||
@ -137,62 +119,47 @@ void slapd_remove(ber_socket_t s, int wake) {
|
|||||||
FD_CLR( s, &slap_daemon.sd_writers );
|
FD_CLR( s, &slap_daemon.sd_writers );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
||||||
|
WAKE_LISTENER(wake);
|
||||||
}
|
}
|
||||||
|
|
||||||
void slapd_clr_write(ber_socket_t s, int wake) {
|
void slapd_clr_write(ber_socket_t s, int wake) {
|
||||||
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
||||||
WAKE_LISTENER(wake);
|
|
||||||
|
|
||||||
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
||||||
FD_CLR( s, &slap_daemon.sd_writers );
|
FD_CLR( s, &slap_daemon.sd_writers );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
||||||
|
WAKE_LISTENER(wake);
|
||||||
if( wake ) {
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void slapd_set_write(ber_socket_t s, int wake) {
|
void slapd_set_write(ber_socket_t s, int wake) {
|
||||||
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
||||||
WAKE_LISTENER(wake);
|
|
||||||
|
|
||||||
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
||||||
FD_SET( (unsigned) s, &slap_daemon.sd_writers );
|
FD_SET( (unsigned) s, &slap_daemon.sd_writers );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
||||||
|
WAKE_LISTENER(wake);
|
||||||
if( wake ) {
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void slapd_clr_read(ber_socket_t s, int wake) {
|
void slapd_clr_read(ber_socket_t s, int wake) {
|
||||||
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
||||||
WAKE_LISTENER(wake);
|
|
||||||
|
|
||||||
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
||||||
FD_CLR( s, &slap_daemon.sd_readers );
|
FD_CLR( s, &slap_daemon.sd_readers );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
||||||
|
WAKE_LISTENER(wake);
|
||||||
if( wake ) {
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void slapd_set_read(ber_socket_t s, int wake) {
|
void slapd_set_read(ber_socket_t s, int wake) {
|
||||||
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
|
||||||
WAKE_LISTENER(wake);
|
|
||||||
|
|
||||||
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
assert( FD_ISSET( s, &slap_daemon.sd_actives) );
|
||||||
FD_SET( s, &slap_daemon.sd_readers );
|
FD_SET( s, &slap_daemon.sd_readers );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
|
||||||
|
WAKE_LISTENER(wake);
|
||||||
if( wake ) {
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void slapd_close(ber_socket_t s) {
|
static void slapd_close(ber_socket_t s) {
|
||||||
@ -387,54 +354,17 @@ int slapd_daemon_init(char *urls, int port, int tls_port )
|
|||||||
}
|
}
|
||||||
#endif /* !FD_SETSIZE */
|
#endif /* !FD_SETSIZE */
|
||||||
|
|
||||||
/* set up a datagram socket connected to itself. we write a byte
|
/* open a pipe (or something equivalent connected to itself).
|
||||||
* on this socket whenever we catch a signal. The main loop will
|
* we write a byte on this fd whenever we catch a signal. The main
|
||||||
* be select'ing on this socket, and will wake up when this byte
|
* loop will be select'ing on this socket, and will wake up when
|
||||||
* arrives.
|
* this byte arrives.
|
||||||
*/
|
*/
|
||||||
if( (sel_exit_fd = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 )
|
if( (rc = lutil_pair( sel_exit_fds )) < 0 )
|
||||||
{
|
{
|
||||||
int err = sock_errno();
|
|
||||||
Debug( LDAP_DEBUG_ANY,
|
Debug( LDAP_DEBUG_ANY,
|
||||||
"daemon: socket() failed errno=%d (%s)\n", err,
|
"daemon: lutil_pair() failed rc=%d\n", rc, 0, 0 );
|
||||||
sock_errstr(err), 0 );
|
|
||||||
return sel_exit_fd;
|
|
||||||
} else {
|
|
||||||
struct sockaddr_in si;
|
|
||||||
int len = sizeof(si);
|
|
||||||
int err;
|
|
||||||
|
|
||||||
(void) memset( (void*) &si, 0, len );
|
|
||||||
|
|
||||||
si.sin_family = AF_INET;
|
|
||||||
si.sin_port = 0;
|
|
||||||
si.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
|
|
||||||
if( rc = bind( sel_exit_fd, (struct sockaddr *)&si, len ) )
|
|
||||||
{
|
|
||||||
err = sock_errno();
|
|
||||||
Debug( LDAP_DEBUG_ANY, "daemon: bind(%ld) failed errno=%d (%s)\n",
|
|
||||||
(long) sel_exit_fd, err, sock_errstr(err) );
|
|
||||||
tcp_close( sel_exit_fd );
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
if( rc = getsockname( sel_exit_fd, (struct sockaddr *)&si, &len))
|
|
||||||
{
|
|
||||||
err = sock_errno();
|
|
||||||
Debug( LDAP_DEBUG_ANY, "daemon: getsockname(%ld) failed errno=%d (%s)\n",
|
|
||||||
(long) sel_exit_fd, err, sock_errstr(err) );
|
|
||||||
tcp_close( sel_exit_fd );
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
if( rc = connect( sel_exit_fd, (struct sockaddr *)&si, len))
|
|
||||||
{
|
|
||||||
err = sock_errno();
|
|
||||||
Debug( LDAP_DEBUG_ANY, "daemon: connect(%ld) failed errno=%d (%s)\n",
|
|
||||||
(long) sel_exit_fd, err, sock_errstr(err) );
|
|
||||||
tcp_close( sel_exit_fd );
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FD_ZERO( &slap_daemon.sd_readers );
|
FD_ZERO( &slap_daemon.sd_readers );
|
||||||
FD_ZERO( &slap_daemon.sd_writers );
|
FD_ZERO( &slap_daemon.sd_writers );
|
||||||
@ -492,6 +422,8 @@ int
|
|||||||
slapd_daemon_destroy(void)
|
slapd_daemon_destroy(void)
|
||||||
{
|
{
|
||||||
connections_destroy();
|
connections_destroy();
|
||||||
|
tcp_close( sel_exit_fds[1] );
|
||||||
|
tcp_close( sel_exit_fds[0] );
|
||||||
sockdestroy();
|
sockdestroy();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -580,7 +512,7 @@ slapd_daemon_task(
|
|||||||
memcpy( &readfds, &slap_daemon.sd_readers, sizeof(fd_set) );
|
memcpy( &readfds, &slap_daemon.sd_readers, sizeof(fd_set) );
|
||||||
memcpy( &writefds, &slap_daemon.sd_writers, sizeof(fd_set) );
|
memcpy( &writefds, &slap_daemon.sd_writers, sizeof(fd_set) );
|
||||||
#endif
|
#endif
|
||||||
FD_SET( sel_exit_fd, &readfds );
|
FD_SET( sel_exit_fds[0], &readfds );
|
||||||
|
|
||||||
for ( l = 0; slap_listeners[l] != NULL; l++ ) {
|
for ( l = 0; slap_listeners[l] != NULL; l++ ) {
|
||||||
if ( slap_listeners[l]->sl_sd == AC_SOCKET_INVALID )
|
if ( slap_listeners[l]->sl_sd == AC_SOCKET_INVALID )
|
||||||
@ -656,10 +588,10 @@ slapd_daemon_task(
|
|||||||
/* FALL THRU */
|
/* FALL THRU */
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FD_ISSET( sel_exit_fd, &readfds ) )
|
if( FD_ISSET( sel_exit_fds[0], &readfds ) )
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
tcp_read( sel_exit_fd, &c, 1 );
|
tcp_read( sel_exit_fds[0], &c, 1 );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for ( l = 0; slap_listeners[l] != NULL; l++ ) {
|
for ( l = 0; slap_listeners[l] != NULL; l++ ) {
|
||||||
@ -1086,23 +1018,9 @@ static int sockdestroy(void)
|
|||||||
void
|
void
|
||||||
slap_set_shutdown( int sig )
|
slap_set_shutdown( int sig )
|
||||||
{
|
{
|
||||||
int l;
|
|
||||||
slapd_shutdown = sig;
|
slapd_shutdown = sig;
|
||||||
#ifndef HAVE_WINSOCK
|
WAKE_LISTENER(1);
|
||||||
if(slapd_listener) {
|
|
||||||
ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* trying to "hit" the socket seems to always get a */
|
|
||||||
/* EWOULDBLOCK error, so just close the listen socket to */
|
|
||||||
/* break out of the select since we're shutting down anyway */
|
|
||||||
for ( l = 0; slap_listeners[l] != NULL; l++ ) {
|
|
||||||
if ( slap_listeners[l]->sl_sd >= 0 ) {
|
|
||||||
tcp_close( slap_listeners[l]->sl_sd );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
tcp_write( sel_exit_fd, "0", 1 );
|
|
||||||
/* reinstall self */
|
/* reinstall self */
|
||||||
(void) SIGNAL( sig, slap_set_shutdown );
|
(void) SIGNAL( sig, slap_set_shutdown );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user