]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/daemon.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / daemon.c
index 2a75f91753ac3fc152e2b735a0935ba63cb0e8ce..31e4fcf8b7c4c27b72c15e336288d94942b25f0d 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2012 The OpenLDAP Foundation.
+ * Copyright 1998-2013 The OpenLDAP Foundation.
  * Portions Copyright 2007 by Howard Chu, Symas Corporation.
  * All rights reserved.
  *
@@ -73,7 +73,9 @@ ber_socket_t dtblsize;
 slap_ssf_t local_ssf = LDAP_PVT_SASL_LOCAL_SSF;
 struct runqueue_s slapd_rq;
 
-#define MAX_DAEMON_THREADS     16
+#ifndef SLAPD_MAX_DAEMON_THREADS
+#define SLAPD_MAX_DAEMON_THREADS       16
+#endif
 int slapd_daemon_threads = 1;
 int slapd_daemon_mask;
 
@@ -84,6 +86,7 @@ int slapd_tcp_wmem;
 
 Listener **slap_listeners = NULL;
 static volatile sig_atomic_t listening = 1; /* 0 when slap_listeners closed */
+static ldap_pvt_thread_t *listener_tid;
 
 #ifndef SLAPD_LISTEN_BACKLOG
 #define SLAPD_LISTEN_BACKLOG 1024
@@ -91,7 +94,7 @@ static volatile sig_atomic_t listening = 1; /* 0 when slap_listeners closed */
 
 #define        DAEMON_ID(fd)   (fd & slapd_daemon_mask)
 
-static ber_socket_t wake_sds[MAX_DAEMON_THREADS][2];
+static ber_socket_t wake_sds[SLAPD_MAX_DAEMON_THREADS][2];
 static int emfile;
 
 static time_t chk_writetime;
@@ -157,7 +160,7 @@ typedef struct slap_daemon_st {
 #endif /* ! epoll && ! /dev/poll */
 } slap_daemon_st;
 
-static slap_daemon_st slap_daemon[MAX_DAEMON_THREADS];
+static slap_daemon_st slap_daemon[SLAPD_MAX_DAEMON_THREADS];
 
 /*
  * NOTE: naming convention for macros:
@@ -1608,7 +1611,7 @@ slapd_daemon_init( const char *urls )
        Debug( LDAP_DEBUG_ARGS, "daemon_init: %s\n",
                urls ? urls : "<null>", 0, 0 );
 
-       for ( i=0; i<MAX_DAEMON_THREADS; i++ ) {
+       for ( i=0; i<SLAPD_MAX_DAEMON_THREADS; i++ ) {
                wake_sds[i][0] = AC_SOCKET_INVALID;
                wake_sds[i][1] = AC_SOCKET_INVALID;
        }
@@ -2070,14 +2073,8 @@ slap_listener(
                        "daemon: connection_init(%ld, %s, %s) failed.\n",
                        (long) sfd, peername, sl->sl_name.bv_val );
                slapd_close(sfd);
-               return 0;
        }
 
-       Statslog( LDAP_DEBUG_STATS,
-               "conn=%ld fd=%ld ACCEPT from %s (%s)\n",
-               c->c_connid, (long) sfd, peername, sl->sl_name.bv_val,
-               0 );
-
        return 0;
 }
 
@@ -2129,7 +2126,7 @@ slapd_daemon_task(
        int l;
        time_t last_idle_check = 0;
        int ebadf = 0;
-       int tid = *(int *)ptr;
+       int tid = (ldap_pvt_thread_t *) ptr - listener_tid;
 
 #define SLAPD_IDLE_CHECK_LIMIT 4
 
@@ -2889,12 +2886,14 @@ int
 slapd_daemon( void )
 {
        int i, rc;
-       ldap_pvt_thread_t       *listener_tid;
 
 #ifdef LDAP_CONNECTIONLESS
        connectionless_init();
 #endif /* LDAP_CONNECTIONLESS */
 
+       if ( slapd_daemon_threads > SLAPD_MAX_DAEMON_THREADS )
+               slapd_daemon_threads = SLAPD_MAX_DAEMON_THREADS;
+
        listener_tid = ch_malloc(slapd_daemon_threads * sizeof(ldap_pvt_thread_t));
 
        /* daemon_init only inits element 0 */
@@ -2916,7 +2915,7 @@ slapd_daemon( void )
        {
                /* listener as a separate THREAD */
                rc = ldap_pvt_thread_create( &listener_tid[i],
-                       0, slapd_daemon_task, (void *)&i );
+                       0, slapd_daemon_task, &listener_tid[i] );
 
                if ( rc != 0 ) {
                        Debug( LDAP_DEBUG_ANY,
@@ -2931,6 +2930,7 @@ slapd_daemon( void )
 
        destroy_listeners();
        ch_free( listener_tid );
+       listener_tid = NULL;
 
        return 0;
 }