]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap_r/tpool.c
Add valx arg to config_parse_add - indicate which value in the current
[openldap] / libraries / libldap_r / tpool.c
index 21d98d64650851c3921246783eb5fc700c6af76c..32d13dd9dff1648222000439f0f3db087024396c 100644 (file)
@@ -50,11 +50,16 @@ typedef struct ldap_int_thread_key_s {
 #define        MAXKEYS 32
 #define        LDAP_MAXTHR     1024    /* must be a power of 2 */
 
+typedef struct ldap_int_thread_userctx_s {
+       ldap_pvt_thread_t ltu_id;
+       ldap_int_thread_key_t ltu_key[MAXKEYS];
+} ldap_int_thread_userctx_t;
+
 static ldap_pvt_thread_t tid_zero;
 
 static struct {
        ldap_pvt_thread_t id;
-       ldap_int_thread_key_t *ctx;
+       ldap_int_thread_userctx_t *ctx;
 } thread_keys[LDAP_MAXTHR];
        
 
@@ -95,12 +100,13 @@ static void *ldap_int_thread_pool_wrapper( void *pool );
 
 static ldap_pvt_thread_t ldap_int_main_tid;
 
-static ldap_int_thread_key_t ldap_int_main_thrctx[LDAP_MAXTHR];
+static ldap_int_thread_userctx_t ldap_int_main_thrctx;
 
 int
 ldap_int_thread_pool_startup ( void )
 {
        ldap_int_main_tid = ldap_pvt_thread_self();
+       ldap_int_main_thrctx.ltu_id = ldap_int_main_tid;
 
        return ldap_pvt_thread_mutex_init(&ldap_pvt_thread_pool_mutex);
 }
@@ -111,7 +117,6 @@ ldap_int_thread_pool_shutdown ( void )
        struct ldap_int_thread_pool_s *pool;
 
        while ((pool = LDAP_STAILQ_FIRST(&ldap_int_thread_pool_list)) != NULL) {
-               LDAP_STAILQ_REMOVE_HEAD(&ldap_int_thread_pool_list, ltp_next);
                (ldap_pvt_thread_pool_destroy)(&pool, 0); /* ignore thr_debug macro */
        }
        ldap_pvt_thread_mutex_destroy(&ldap_pvt_thread_pool_mutex);
@@ -459,30 +464,116 @@ ldap_pvt_thread_pool_maxthreads ( ldap_pvt_thread_pool_t *tpool, int max_threads
 }
 
 int
-ldap_pvt_thread_pool_backload ( ldap_pvt_thread_pool_t *tpool )
+ldap_pvt_thread_pool_query ( ldap_pvt_thread_pool_t *tpool, ldap_pvt_thread_pool_param_t param, void *value )
 {
-       struct ldap_int_thread_pool_s *pool;
-       int count;
+       struct ldap_int_thread_pool_s   *pool;
+       int                             count = -1;
 
-       if (tpool == NULL)
-               return(-1);
+       if ( tpool == NULL || value == NULL ) {
+               return -1;
+       }
 
        pool = *tpool;
 
-       if (pool == NULL)
-               return(0);
+       if ( pool == NULL ) {
+               return 0;
+       }
 
        ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
-       count = pool->ltp_pending_count + pool->ltp_active_count;
-       ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
-       return(count);
+       switch ( param ) {
+       case LDAP_PVT_THREAD_POOL_PARAM_MAX:
+               count = pool->ltp_max_count;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING:
+               count = pool->ltp_max_pending;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_OPEN:
+               count = pool->ltp_open_count;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_STARTING:
+               count = pool->ltp_starting;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_ACTIVE:
+               count = pool->ltp_active_count;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_PENDING:
+               count = pool->ltp_pending_count;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD:
+               count = pool->ltp_pending_count + pool->ltp_active_count;
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX:
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX:
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX:
+               break;
+
+       case LDAP_PVT_THREAD_POOL_PARAM_STATE: {
+               static struct {
+                       char                            *name;
+                       ldap_int_thread_pool_state_t    state;
+               }               str2state[] = {
+                       { "running",    LDAP_INT_THREAD_POOL_RUNNING },
+                       { "finishing",  LDAP_INT_THREAD_POOL_FINISHING },
+                       { "stopping",   LDAP_INT_THREAD_POOL_STOPPING },
+                       { "pausing",    LDAP_INT_THREAD_POOL_PAUSING },
+                       { NULL }
+               };
+               int             i;
+
+               for ( i = 0; str2state[ i ].name != NULL; i++ ) {
+                       if ( str2state[ i ].state == pool->ltp_state ) {
+                               break;
+                       }
+               }
+               *((char **)value) = str2state[ i ].name;
+               if ( str2state[ i ].name != NULL ) {
+                       count = -2;
+               }
+               } break;
+       }
+       ldap_pvt_thread_mutex_unlock( &pool->ltp_mutex );
+
+       if ( count > -1 ) {
+               *((int *)value) = count;
+       }
+
+       return ( count == -1 ? -1 : 0 );
+}
+
+/*
+ * wrapper for ldap_pvt_thread_pool_query(), left around
+ * for backwards compatibility
+ */
+int
+ldap_pvt_thread_pool_backload ( ldap_pvt_thread_pool_t *tpool )
+{
+       int     rc, count;
+
+       rc = ldap_pvt_thread_pool_query( tpool,
+               LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD, (void *)&count );
+
+       if ( rc == 0 ) {
+               return count;
+       }
+
+       return rc;
 }
 
 int
 ldap_pvt_thread_pool_destroy ( ldap_pvt_thread_pool_t *tpool, int run_pending )
 {
        struct ldap_int_thread_pool_s *pool, *pptr;
-       long waiting;
        ldap_int_thread_ctx_t *ctx;
 
        if (tpool == NULL)
@@ -511,6 +602,7 @@ ldap_pvt_thread_pool_destroy ( ldap_pvt_thread_pool_t *tpool, int run_pending )
                ldap_pvt_thread_cond_broadcast(&pool->ltp_cond);
                ldap_pvt_thread_cond_wait(&pool->ltp_cond, &pool->ltp_mutex);
        }
+       ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
 
        while ((ctx = LDAP_STAILQ_FIRST(&pool->ltp_pending_list)) != NULL)
        {
@@ -542,27 +634,26 @@ ldap_int_thread_pool_wrapper (
 {
        struct ldap_int_thread_pool_s *pool = xpool;
        ldap_int_thread_ctx_t *ctx;
-       ldap_int_thread_key_t ltc_key[MAXKEYS];
-       ldap_pvt_thread_t tid;
+       ldap_int_thread_userctx_t uctx;
        int i, keyslot, hash;
 
        if (pool == NULL)
                return NULL;
 
        for ( i=0; i<MAXKEYS; i++ ) {
-               ltc_key[i].ltk_key = NULL;
+               uctx.ltu_key[i].ltk_key = NULL;
        }
 
-       tid = ldap_pvt_thread_self();
+       uctx.ltu_id = ldap_pvt_thread_self();
 
        ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
 
        /* store pointer to our keys */
-       TID_HASH(tid, hash);
+       TID_HASH(uctx.ltu_id, hash);
        for (i = hash & (LDAP_MAXTHR-1);
-                               !ldap_pvt_thread_equal(thread_keys[i].id, tid);
+                               !ldap_pvt_thread_equal(thread_keys[i].id, uctx.ltu_id);
                                i = (i+1) & (LDAP_MAXTHR-1));
-       thread_keys[i].ctx = ltc_key;
+       thread_keys[i].ctx = &uctx;
        keyslot = i;
 
        while (pool->ltp_state != LDAP_INT_THREAD_POOL_STOPPING) {
@@ -610,7 +701,7 @@ ldap_int_thread_pool_wrapper (
                pool->ltp_active_count++;
                ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
 
-               ctx->ltc_start_routine(ltc_key, ctx->ltc_arg);
+               ctx->ltc_start_routine(&uctx, ctx->ltc_arg);
 
 #ifdef LDAP_PVT_THREAD_POOL_SEM_LOAD_CONTROL
                ldap_lazy_sem_post( thread_pool_sem );
@@ -629,11 +720,11 @@ ldap_int_thread_pool_wrapper (
                }
        }
 
-       for ( i=0; i<MAXKEYS && ltc_key[i].ltk_key; i++ ) {
-               if (ltc_key[i].ltk_free)
-                       ltc_key[i].ltk_free(
-                               ltc_key[i].ltk_key,
-                               ltc_key[i].ltk_data );
+       for ( i=0; i<MAXKEYS && uctx.ltu_key[i].ltk_key; i++ ) {
+               if (uctx.ltu_key[i].ltk_free)
+                       uctx.ltu_key[i].ltk_free(
+                               uctx.ltu_key[i].ltk_key,
+                               uctx.ltu_key[i].ltk_data );
        }
 
        thread_keys[keyslot].ctx = NULL;
@@ -712,15 +803,15 @@ int ldap_pvt_thread_pool_getkey(
        void **data,
        ldap_pvt_thread_pool_keyfree_t **kfree )
 {
-       ldap_int_thread_key_t *ctx = xctx;
+       ldap_int_thread_userctx_t *ctx = xctx;
        int i;
 
        if ( !ctx || !data ) return EINVAL;
 
-       for ( i=0; i<MAXKEYS && ctx[i].ltk_key; i++ ) {
-               if ( ctx[i].ltk_key == key ) {
-                       *data = ctx[i].ltk_data;
-                       if ( kfree ) *kfree = ctx[i].ltk_free;
+       for ( i=0; i<MAXKEYS && ctx->ltu_key[i].ltk_key; i++ ) {
+               if ( ctx->ltu_key[i].ltk_key == key ) {
+                       *data = ctx->ltu_key[i].ltk_data;
+                       if ( kfree ) *kfree = ctx->ltu_key[i].ltk_free;
                        return 0;
                }
        }
@@ -733,16 +824,16 @@ int ldap_pvt_thread_pool_setkey(
        void *data,
        ldap_pvt_thread_pool_keyfree_t *kfree )
 {
-       ldap_int_thread_key_t *ctx = xctx;
+       ldap_int_thread_userctx_t *ctx = xctx;
        int i;
 
        if ( !ctx || !key ) return EINVAL;
 
        for ( i=0; i<MAXKEYS; i++ ) {
-               if ( !ctx[i].ltk_key || ctx[i].ltk_key == key ) {
-                       ctx[i].ltk_key = key;
-                       ctx[i].ltk_data = data;
-                       ctx[i].ltk_free = kfree;
+               if ( !ctx->ltu_key[i].ltk_key || ctx->ltu_key[i].ltk_key == key ) {
+                       ctx->ltu_key[i].ltk_key = key;
+                       ctx->ltu_key[i].ltk_data = data;
+                       ctx->ltu_key[i].ltk_free = kfree;
                        return 0;
                }
        }
@@ -755,17 +846,18 @@ int ldap_pvt_thread_pool_setkey(
 void ldap_pvt_thread_pool_purgekey( void *key )
 {
        int i, j;
-       ldap_int_thread_key_t *ctx;
+       ldap_int_thread_userctx_t *ctx;
 
        for ( i=0; i<LDAP_MAXTHR; i++ ) {
                if ( thread_keys[i].ctx ) {
                        ctx = thread_keys[i].ctx;
                        for ( j=0; j<MAXKEYS; j++ ) {
-                               if ( ctx[j].ltk_key == key ) {
-                                       if (ctx[j].ltk_free)
-                                               ctx[j].ltk_free( ctx[j].ltk_key, ctx[j].ltk_data );
-                                       ctx[j].ltk_key = NULL;
-                                       ctx[j].ltk_free = NULL;
+                               if ( ctx->ltu_key[j].ltk_key == key ) {
+                                       if (ctx->ltu_key[j].ltk_free)
+                                               ctx->ltu_key[j].ltk_free( ctx->ltu_key[j].ltk_key,
+                                               ctx->ltu_key[j].ltk_data );
+                                       ctx->ltu_key[j].ltk_key = NULL;
+                                       ctx->ltu_key[j].ltk_free = NULL;
                                        break;
                                }
                        }
@@ -787,7 +879,7 @@ void *ldap_pvt_thread_pool_context( )
 
        tid = ldap_pvt_thread_self();
        if ( ldap_pvt_thread_equal( tid, ldap_int_main_tid ))
-               return ldap_int_main_thrctx;
+               return &ldap_int_main_thrctx;
 
        TID_HASH( tid, hash );
        for (i = hash & (LDAP_MAXTHR-1);
@@ -800,13 +892,21 @@ void *ldap_pvt_thread_pool_context( )
 
 void ldap_pvt_thread_pool_context_reset( void *vctx )
 {
-       ldap_int_thread_key_t *ctx = vctx;
+       ldap_int_thread_userctx_t *ctx = vctx;
        int i;
 
-       for ( i=0; i<MAXKEYS && ctx[i].ltk_key; i++) {
-               if ( ctx[i].ltk_free )
-                       ctx[i].ltk_free( ctx[i].ltk_key, ctx[i].ltk_data );
-               ctx[i].ltk_key = NULL;
+       for ( i=0; i<MAXKEYS && ctx->ltu_key[i].ltk_key; i++) {
+               if ( ctx->ltu_key[i].ltk_free )
+                       ctx->ltu_key[i].ltk_free( ctx->ltu_key[i].ltk_key,
+                       ctx->ltu_key[i].ltk_data );
+               ctx->ltu_key[i].ltk_key = NULL;
        }
 }
+
+ldap_pvt_thread_t ldap_pvt_thread_pool_tid( void *vctx )
+{
+       ldap_int_thread_userctx_t *ctx = vctx;
+
+       return ctx->ltu_id;
+}
 #endif /* LDAP_THREAD_HAVE_TPOOL */