]> git.sur5r.net Git - openldap/commitdiff
Add ldap_pvt_thread_pool_purgekey to free all instances of key across
authorHoward Chu <hyc@openldap.org>
Fri, 22 Apr 2005 22:27:29 +0000 (22:27 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 22 Apr 2005 22:27:29 +0000 (22:27 +0000)
all threads.

include/ldap_pvt_thread.h
libraries/libldap_r/tpool.c

index 6c1b86845b279647395c99f7db0e62f1ef95ea1f..1ca300bd9861fd79a1d9d0d80c35ca2148cd7dcd 100644 (file)
@@ -202,6 +202,9 @@ ldap_pvt_thread_pool_setkey LDAP_P((
        void *data,
        ldap_pvt_thread_pool_keyfree_t *kfree ));
 
+LDAP_F( void )
+ldap_pvt_thread_pool_purgekey LDAP_P(( void *key ));
+
 LDAP_F( void *)
 ldap_pvt_thread_pool_context LDAP_P(( void ));
 
index 31fa541cb8d96aa44dbba1f3303c41e59215bd4a..50bac8d2c1c06c75011ccf80d79404f0c50b5225 100644 (file)
@@ -616,6 +616,30 @@ int ldap_pvt_thread_pool_setkey(
        return ENOMEM;
 }
 
+/* Free all elements with this key, no matter which thread they're in.
+ * May only be called while the pool is paused.
+ */
+void ldap_pvt_thread_pool_purgekey( void *key )
+{
+       int i, j;
+       ldap_int_thread_key_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;
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+
 /*
  * This is necessary if the caller does not have access to the
  * thread context handle (for example, a slapd plugin calling