LDAP_F( int )
ldap_pvt_thread_pool_init LDAP_P((
ldap_pvt_thread_pool_t *pool_out,
- int max_concurrency,
+ int max_threads,
int max_pending ));
LDAP_F( int )
void *(*start_routine)( void * ),
void *arg ));
+LDAP_F( int )
+ldap_pvt_thread_pool_maxthreads LDAP_P((
+ ldap_pvt_thread_pool_t *pool,
+ int max_threads ));
+
LDAP_F( int )
ldap_pvt_thread_pool_backload LDAP_P((
ldap_pvt_thread_pool_t *pool ));
int
ldap_pvt_thread_pool_init (
ldap_pvt_thread_pool_t *tpool,
- int max_concurrency,
+ int max_threads,
int max_pending )
{
ldap_pvt_thread_pool_t pool;
if (rc != 0)
return(rc);
pool->ltp_state = LDAP_INT_THREAD_POOL_RUNNING;
- pool->ltp_max_count = max_concurrency;
+ pool->ltp_max_count = max_threads;
pool->ltp_max_pending = max_pending;
ldap_pvt_thread_mutex_lock(&ldap_pvt_thread_pool_mutex);
ldap_int_thread_enlist(&ldap_int_thread_pool_list, pool);
return(0);
}
+int
+ldap_pvt_thread_pool_maxthreads ( ldap_pvt_thread_pool_t *tpool, int max_threads )
+{
+ struct ldap_int_thread_pool_s *pool;
+
+ if (tpool == NULL)
+ return(-1);
+
+ pool = *tpool;
+
+ if (pool == NULL)
+ return(-1);
+
+ ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
+ pool->ltp_max_count = max_threads;
+ ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
+ return(0);
+}
+
int
ldap_pvt_thread_pool_backload ( ldap_pvt_thread_pool_t *tpool )
{
if (ctx == NULL) {
if (pool->ltp_state == LDAP_INT_THREAD_POOL_FINISHING)
break;
+ if (pool->ltp_max_count > 0
+ && pool->ltp_open_count > pool->ltp_max_count)
+ {
+ /* too many threads running (can happen if the
+ * maximum threads value is set during ongoing
+ * operation using ldap_pvt_thread_pool_maxthreads)
+ * so let this thread die.
+ */
+ break;
+ }
+
/* we could check an idle timer here, and let the
* thread die if it has been inactive for a while.
* only die if there are other open threads (i.e.,
ldap_pvt_thread_set_concurrency( c );
+ /* set maximum threads in thread pool */
+ } else if ( strcasecmp( cargv[0], "threads" ) == 0 ) {
+ int c;
+ if ( cargc < 2 ) {
+ Debug( LDAP_DEBUG_ANY,
+ "%s: line %d: missing count in \"threads <count>\" line\n",
+ fname, lineno, 0 );
+ return( 1 );
+ }
+
+ c = atoi( cargv[1] );
+
+ if( c < 0 ) {
+ Debug( LDAP_DEBUG_ANY,
+ "%s: line %d: invalid level (%d) in \"threads <count>\" line\n",
+ fname, lineno, c );
+ return( 1 );
+ }
+
+ ldap_pvt_thread_pool_maxthreads( &connection_pool, c );
+
/* get pid file name */
} else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) {
if ( cargc < 2 ) {
(void) ldap_pvt_thread_initialize();
- ldap_pvt_thread_pool_init(&connection_pool, 0, 0);
+ ldap_pvt_thread_pool_init(&connection_pool, SLAP_MAX_WORKER_THREADS, 0);
ldap_pvt_thread_mutex_init( ¤ttime_mutex );
ldap_pvt_thread_mutex_init( &entry2str_mutex );