diff --git a/libraries/libldap_r/tpool.c b/libraries/libldap_r/tpool.c index c6eeed959cf85b1c8c823e4741c0ce944bb4668c..4cecaee9da7b28dcfa014457391c16294eca452e 100644 --- a/libraries/libldap_r/tpool.c +++ b/libraries/libldap_r/tpool.c @@ -170,6 +170,10 @@ ldap_pvt_thread_pool_init ( return(0); } +#define TID_HASH(tid, hash) do { int i; \ + unsigned char *ptr = (unsigned char *)&(tid); \ + for (i=0, hash=0; i<sizeof(tid); i++) hash += ptr[i]; } while(0) + int ldap_pvt_thread_pool_submit ( ldap_pvt_thread_pool_t *tpool, @@ -237,13 +241,15 @@ ldap_pvt_thread_pool_submit ( rc = ldap_pvt_thread_create( &thr, 1, ldap_int_thread_pool_wrapper, pool ); if (rc == 0) { + int hash; pool->ltp_starting--; /* assign this thread ID to a key slot; start * at the thread ID itself (mod MAXTHREADS) and * look for an empty slot. */ - for (rc = thr & (MAXTHREADS-1); thread_keys[rc].id; + TID_HASH(thr, hash); + for (rc = hash & (MAXTHREADS-1); thread_keys[rc].id; rc = (rc+1) & (MAXTHREADS-1)); thread_keys[rc].id = thr; } else { @@ -387,7 +393,7 @@ ldap_int_thread_pool_wrapper ( ldap_int_thread_ctx_t *ctx; ldap_int_thread_key_t ltc_key[MAXKEYS]; ldap_pvt_thread_t tid; - int i, keyslot; + int i, keyslot, hash; if (pool == NULL) return NULL; @@ -401,7 +407,8 @@ ldap_int_thread_pool_wrapper ( ldap_pvt_thread_mutex_lock(&pool->ltp_mutex); /* store pointer to our keys */ - for (i = tid & (MAXTHREADS-1); thread_keys[i].id != tid; + TID_HASH(tid, hash); + for (i = hash & (MAXTHREADS-1); thread_keys[i].id != tid; i = (i+1) & (MAXTHREADS-1)); thread_keys[i].ctx = ltc_key; keyslot = i; @@ -533,11 +540,12 @@ int ldap_pvt_thread_pool_setkey( void *ldap_pvt_thread_pool_context( ) { ldap_pvt_thread_t tid; - int i; + int i, hash; tid = ldap_pvt_thread_self(); - for (i = tid & (MAXTHREADS-1); thread_keys[i].id && + TID_HASH( tid, hash ); + for (i = hash & (MAXTHREADS-1); thread_keys[i].id && thread_keys[i].id != tid; i = (i+1) & (MAXTHREADS-1)); return thread_keys[i].ctx;