X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=2893a905f90c1f05de7eb85f2332dd0cd2605439;hb=b94a77687075b0eb2d54d087b8b956d197c1023c;hp=a0efe04256f474a5e982a97a475e663b6936f36b;hpb=c7a8625da7f7063c86dba7606a0cb8ef9304c183;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index a0efe04256..2893a905f9 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-2004 The OpenLDAP Foundation. + * Copyright 1998-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,7 +40,9 @@ #include "ldap_rq.h" -#ifdef HAVE_SYS_EPOLL_H +#undef HAVE_EPOLL + +#if defined(HAVE_SYS_EPOLL_H) && defined(HAVE_EPOLL) #include #endif @@ -70,6 +72,7 @@ int slap_inet4or6 = AF_INET; time_t starttime; ber_socket_t dtblsize; slap_ssf_t local_ssf = LDAP_PVT_SASL_LOCAL_SSF; +struct runqueue_s slapd_rq; Listener **slap_listeners = NULL; @@ -975,8 +978,14 @@ static int slap_open_listener( #endif #ifdef LDAP_PF_LOCAL case AF_LOCAL: - addrlen = sizeof(struct sockaddr_un); - break; +#ifdef LOCAL_CREDS + { + int one = 1; + setsockopt(l.sl_sd, 0, LOCAL_CREDS, &one, sizeof one); + } +#endif + addrlen = sizeof(struct sockaddr_un); + break; #endif } @@ -1480,6 +1489,7 @@ slapd_daemon_task( int l; time_t last_idle_check = 0; struct timeval idle; + int ebadf = 0; #define SLAPD_IDLE_CHECK_LIMIT 4 @@ -1570,7 +1580,6 @@ slapd_daemon_task( int at; ber_socket_t nfds, nrfds, nwfds; #define SLAPD_EBADF_LIMIT 16 - int ebadf = 0; time_t now; @@ -1646,24 +1655,24 @@ slapd_daemon_task( else tvp = NULL; - ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex ); - rtask = ldap_pvt_runqueue_next_sched( &syncrepl_rq, &cat ); + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); + rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat ); while ( cat && cat->tv_sec && cat->tv_sec <= now ) { - if ( ldap_pvt_runqueue_isrunning( &syncrepl_rq, rtask )) { - ldap_pvt_runqueue_resched( &syncrepl_rq, rtask, 0 ); + if ( ldap_pvt_runqueue_isrunning( &slapd_rq, rtask )) { + ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 ); } else { - ldap_pvt_runqueue_runtask( &syncrepl_rq, rtask ); - ldap_pvt_runqueue_resched( &syncrepl_rq, rtask, 0 ); - ldap_pvt_thread_mutex_unlock( &syncrepl_rq.rq_mutex ); + ldap_pvt_runqueue_runtask( &slapd_rq, rtask ); + ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 ); + ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); ldap_pvt_thread_pool_submit( &connection_pool, rtask->routine, (void *) rtask ); - ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex ); + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); } - rtask = ldap_pvt_runqueue_next_sched( &syncrepl_rq, &cat ); + rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat ); } - ldap_pvt_thread_mutex_unlock( &syncrepl_rq.rq_mutex ); + ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); - if ( cat != NULL ) { + if ( cat && cat->tv_sec ) { time_t diff = difftime( cat->tv_sec, now ); if ( diff == 0 ) diff = tdelta; @@ -1711,10 +1720,12 @@ slapd_daemon_task( case 0: /* timeout - let threads run */ ebadf = 0; +#ifndef HAVE_YIELDING_SELECT Debug( LDAP_DEBUG_CONNS, "daemon: select timeout - yielding\n", 0, 0, 0 ); ldap_pvt_thread_yield(); +#endif continue; default: /* something happened - deal with it */ @@ -1726,19 +1737,16 @@ slapd_daemon_task( /* FALL THRU */ } - /* We don't need to examine the event status for wake_sds; - * if waking is set and we woke up, we'll read whatever - * we can. - */ - if ( waking ) { +#if SLAP_EVENTS_ARE_INDEXED + if ( SLAP_EVENT_IS_READ( wake_sds[0] )) { char c[BUFSIZ]; tcp_read( wake_sds[0], c, sizeof(c) ); waking = 0; ns--; + SLAP_EVENT_CLR_READ( wake_sds[0] ); continue; } -#if SLAP_EVENTS_ARE_INDEXED /* The event slot equals the descriptor number - this is * true for Unix select and poll. We treat Windows select * like this too, even though it's a kludge. @@ -1770,7 +1778,9 @@ slapd_daemon_task( /* bypass the following tests if no descriptors left */ if ( ns <= 0 ) { +#ifndef HAVE_YIELDING_SELECT ldap_pvt_thread_yield(); +#endif continue; } @@ -1844,6 +1854,7 @@ slapd_daemon_task( } slapd_close( wd ); } + SLAP_EVENT_CLR_WRITE( wd ); } for ( i = 0; nrfds > 0; i++ ) @@ -1880,12 +1891,23 @@ slapd_daemon_task( * all other connections last (as we do for select), we would need * to use multiple event handles and cascade them. * - * That seems like a bit of hassle. So the wake_sds check has moved - * above. For epoll and kqueue we can associate arbitrary data with + * That seems like a bit of hassle. So the wake_sds check has been + * skipped. For epoll and kqueue we can associate arbitrary data with * an event, so we could use pointers to the listener structure * instead of just the file descriptor. For /dev/poll we have to * search the listeners array for a matching descriptor. */ + /* if waking is set and we woke up, we'll read whatever + * we can. + */ + if ( waking ) { + char c[BUFSIZ]; + tcp_read( wake_sds[0], c, sizeof(c) ); + waking = 0; + ns--; + continue; + } + #ifdef LDAP_DEBUG Debug( LDAP_DEBUG_CONNS, "daemon: activity on:", 0, 0, 0 ); @@ -1954,7 +1976,9 @@ slapd_daemon_task( } #endif /* SLAP_EVENTS_ARE_INDEXED */ +#ifndef HAVE_YIELDING_SELECT ldap_pvt_thread_yield(); +#endif } if( slapd_shutdown == 1 ) {