]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#8858 Introduce ldap_pvt_thread_pool_walk
authorOndřej Kuzník <okuznik@symas.com>
Tue, 20 Feb 2018 15:21:46 +0000 (15:21 +0000)
committerOndřej Kuzník <ondra@openldap.org>
Fri, 19 Oct 2018 12:08:09 +0000 (13:08 +0100)
include/ldap_pvt_thread.h
libraries/libldap_r/tpool.c

index 2f4332607d20a58ce104d71597ec414e8cb1aa94..1a711e8c8d0fe53f6deb6fa1420a6a4ebe28a41f 100644 (file)
@@ -220,6 +220,7 @@ ldap_pvt_thread_rdwr_active LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
 typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t;
 
 typedef void * (ldap_pvt_thread_start_t) LDAP_P((void *ctx, void *arg));
+typedef int (ldap_pvt_thread_walk_t) LDAP_P((ldap_pvt_thread_start_t *start, void *start_arg, void *arg));
 typedef void (ldap_pvt_thread_pool_keyfree_t) LDAP_P((void *key, void *data));
 #endif /* !LDAP_PVT_THREAD_H_DONE */
 
@@ -253,6 +254,13 @@ LDAP_F( int )
 ldap_pvt_thread_pool_retract LDAP_P((
        void *cookie ));
 
+LDAP_F( int )
+ldap_pvt_thread_pool_walk LDAP_P((
+       ldap_pvt_thread_pool_t *pool,
+       ldap_pvt_thread_start_t *start,
+       ldap_pvt_thread_walk_t *cb,
+       void *arg ));
+
 LDAP_F( int )
 ldap_pvt_thread_pool_maxthreads LDAP_P((
        ldap_pvt_thread_pool_t *pool,
index 8d79184ca69423f34f3cefef0c49e8b5b83ecce3..c5393083159a8daf4f8b0d7a0abda4590c38b8c9 100644 (file)
@@ -516,6 +516,46 @@ ldap_pvt_thread_pool_retract (
        return task != NULL;
 }
 
+/* Walk the pool and allow tasks to be retracted, only to be called while the
+ * pool is paused */
+int
+ldap_pvt_thread_pool_walk(
+       ldap_pvt_thread_pool_t *tpool,
+       ldap_pvt_thread_start_t *start,
+       ldap_pvt_thread_walk_t *cb, void *arg )
+{
+       struct ldap_int_thread_pool_s *pool;
+       struct ldap_int_thread_poolq_s *pq;
+       ldap_int_thread_task_t *task;
+       int i;
+
+       if (tpool == NULL)
+               return(-1);
+
+       pool = *tpool;
+
+       if (pool == NULL)
+               return(-1);
+
+       ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
+       assert(pool->ltp_pause == PAUSED);
+       ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
+
+       for (i=0; i<pool->ltp_numqs; i++) {
+               pq = pool->ltp_wqs[i];
+               LDAP_STAILQ_FOREACH(task, &pq->ltp_pending_list, ltt_next.q) {
+                       if ( task->ltt_start_routine == start ) {
+                               if ( cb( task->ltt_start_routine, task->ltt_arg, arg ) ) {
+                                       /* retract */
+                                       task->ltt_start_routine = no_task;
+                                       task->ltt_arg = NULL;
+                               }
+                       }
+               }
+       }
+       return 0;
+}
+
 /* Set number of work queues in this pool. Should not be
  * more than the number of CPUs. */
 int