7df6e18265341f87a69fba808aa1f92f8ebca841 markd Wed Apr 15 13:39:42 2026 -0700 move copy of htslib diff --git src/htslib/cram/thread_pool.h src/htslib/cram/thread_pool.h deleted file mode 100644 index 8158c85b54b..00000000000 --- src/htslib/cram/thread_pool.h +++ /dev/null @@ -1,218 +0,0 @@ -/* -Copyright (c) 2013 Genome Research Ltd. -Author: James Bonfield <jkb@sanger.ac.uk> - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - - 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger -Institute nor the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * This file implements a thread pool for multi-threading applications. - * It consists of two distinct interfaces: thread pools an results queues. - * - * The pool of threads is given a function pointer and void* data to pass in. - * This means the pool can run jobs of multiple types, albeit first come - * first served with no job scheduling. - * - * Upon completion, the return value from the function pointer is added to - * a results queue. We may have multiple queues in use for the one pool. - * - * An example: reading from BAM and writing to CRAM with 10 threads. We'll - * have a pool of 10 threads and two results queues holding decoded BAM blocks - * and encoded CRAM blocks respectively. - */ - -#ifndef _THREAD_POOL_H_ -#define _THREAD_POOL_H_ - -#include <pthread.h> - -#ifdef __cplusplus -extern "C" { -#endif - -struct t_pool; -struct t_results_queue; - -typedef struct t_pool_job { - void *(*func)(void *arg); - void *arg; - struct t_pool_job *next; - - struct t_pool *p; - struct t_results_queue *q; - int serial; -} t_pool_job; - -typedef struct t_res { - struct t_res *next; - int serial; // sequential number for ordering - void *data; // result itself -} t_pool_result; - -struct t_pool; - -typedef struct { - struct t_pool *p; - int idx; - pthread_t tid; - pthread_cond_t pending_c; - long long wait_time; -} t_pool_worker_t; - -typedef struct t_pool { - int qsize; // size of queue - int njobs; // pending job count - int nwaiting; // how many workers waiting for new jobs - int shutdown; // true if pool is being destroyed - - // queue of pending jobs - t_pool_job *head, *tail; - - // threads - int tsize; // maximum number of jobs - t_pool_worker_t *t; - - // Mutexes - pthread_mutex_t pool_m; // used when updating head/tail - - pthread_cond_t empty_c; - pthread_cond_t pending_c; // not empty - pthread_cond_t full_c; - - // array of worker IDs free - int *t_stack, t_stack_top; - - // Debugging to check wait time - long long total_time, wait_time; -} t_pool; - -typedef struct t_results_queue { - t_pool_result *result_head; - t_pool_result *result_tail; - int next_serial; - int curr_serial; - int queue_len; // number of items in queue - int pending; // number of pending items (in progress or in pool list) - pthread_mutex_t result_m; - pthread_cond_t result_avail_c; -} t_results_queue; - - -/* - * Creates a worker pool of length qsize with tsize worker threads. - * - * Returns pool pointer on success; - * NULL on failure - */ -t_pool *t_pool_init(int qsize, int tsize); - -/* - * Adds an item to the work pool. - * - * FIXME: Maybe return 1,0,-1 and distinguish between job dispathed vs - * result returned. Ie rather than blocking on full queue we're permitted - * to return early on "result available" event too. - * Caller would then have a while loop around t_pool_dispatch. - * Or, return -1 and set errno to E_AGAIN to indicate job not yet submitted. - * - * Returns 0 on success - * -1 on failure - */ -int t_pool_dispatch(t_pool *p, t_results_queue *q, - void *(*func)(void *arg), void *arg); -int t_pool_dispatch2(t_pool *p, t_results_queue *q, - void *(*func)(void *arg), void *arg, int nonblock); - -/* - * Flushes the pool, but doesn't exit. This simply drains the queue and - * ensures all worker threads have finished their current task. - * - * Returns 0 on success; - * -1 on failure - */ -int t_pool_flush(t_pool *p); - -/* - * Destroys a thread pool. If 'kill' is true the threads are terminated now, - * otherwise they are joined into the main thread so they will finish their - * current work load. - * - * Use t_pool_destroy(p,0) after a t_pool_flush(p) on a normal shutdown or - * t_pool_destroy(p,1) to quickly exit after a fatal error. - */ -void t_pool_destroy(t_pool *p, int kill); - -/* - * Pulls a result off the head of the result queue. Caller should - * free it (and any internals as appropriate) after use. This doesn't - * wait for a result to be present. - * - * Results will be returned in strict order. - * - * Returns t_pool_result pointer if a result is ready. - * NULL if not. - */ -t_pool_result *t_pool_next_result(t_results_queue *q); -t_pool_result *t_pool_next_result_wait(t_results_queue *q); - -/* - * Frees a result 'r' and if free_data is true also frees - * the internal r->data result too. - */ -void t_pool_delete_result(t_pool_result *r, int free_data); - -/* - * Initialises a results queue. - * - * Results queue pointer on success; - * NULL on failure - */ -t_results_queue *t_results_queue_init(void); - -/* Deallocates memory for a results queue */ -void t_results_queue_destroy(t_results_queue *q); - -/* - * Returns true if there are no items on the finished results queue and - * also none still pending. - */ -int t_pool_results_queue_empty(t_results_queue *q); - -/* - * Returns the number of completed jobs on the results queue. - */ -int t_pool_results_queue_len(t_results_queue *q); - -/* - * Returns the number of completed jobs plus the number queued up to run. - */ -int t_pool_results_queue_sz(t_results_queue *q); - -#ifdef __cplusplus -} -#endif - -#endif /* _THREAD_POOL_H_ */