X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=2893a905f90c1f05de7eb85f2332dd0cd2605439;hb=8da81d42c7b31191c175aa0a8a9439b66594f3c3;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 ) {