]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/daemon.c
ITS#3538: improved substrings matching (spaces handled
[openldap] / servers / slapd / daemon.c
index 79e0e850849516a2847fdeba47e55a284fcc25c0..2893a905f90c1f05de7eb85f2332dd0cd2605439 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * 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 <sys/epoll.h>
 #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;
 
@@ -80,7 +83,7 @@ static int emfile;
 
 static int waking;
 #define WAKE_LISTENER(w) \
-do { if (w && waking < 5) { tcp_write( wake_sds[1], "0", 1 ); waking++;} } while(0)
+do { if (w && waking < 5) { waking++; tcp_write( wake_sds[1], "0", 1 ); } } while(0)
 
 volatile sig_atomic_t slapd_shutdown = 0, slapd_gentle_shutdown = 0;
 volatile sig_atomic_t slapd_abrupt_shutdown = 0;
@@ -228,7 +231,7 @@ static struct slap_daemon {
 #define SLAP_EVENT_INIT \
        AC_MEMCPY( &readfds, &slap_daemon.sd_readers, sizeof(fd_set) ); \
        if ( nwriters ) \
-               AC_MEMCPY( &writefds, &slap_daemon.sd_writers, sizeof(fd_set) );
+               AC_MEMCPY( &writefds, &slap_daemon.sd_writers, sizeof(fd_set) )
 
 #ifdef FD_SETSIZE
 #define        CHK_SETSIZE     \
@@ -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 ) {