diff options
author | Thomas White <taw@physics.org> | 2011-11-15 12:05:55 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2012-02-22 15:27:40 +0100 |
commit | 38089071300b8e04ed42236dd08d9055094fb3b8 (patch) | |
tree | 91e1487ac820eb549e7652750867cd4fec039097 /libcrystfel/src/thread-pool.h | |
parent | 404c612223dbfa0210902ebc5c9226927335aa65 (diff) |
Introduce "libcrystfel"
Diffstat (limited to 'libcrystfel/src/thread-pool.h')
-rw-r--r-- | libcrystfel/src/thread-pool.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/libcrystfel/src/thread-pool.h b/libcrystfel/src/thread-pool.h new file mode 100644 index 00000000..a99a7ade --- /dev/null +++ b/libcrystfel/src/thread-pool.h @@ -0,0 +1,71 @@ +/* + * thread-pool.h + * + * A thread pool implementation + * + * (c) 2006-2010 Thomas White <taw@physics.org> + * + * Part of CrystFEL - crystallography with a FEL + * + */ + + +#ifndef THREAD_POOL_H +#define THREAD_POOL_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + + +#include <pthread.h> + +extern pthread_mutex_t stderr_lock; +extern signed int get_status_label(void); + + +/** + * TPGetTaskFunc: + * @qargs: The queue_args pointer which was given to run_threads(). + * Returns: A pointer which will be passed to the worker function. + * + * This function is called, non-reentrantly, to get a new work item to give to + * your work function. The stuff you need to generate the new work item should + * have been stored in @qargs which was passed to run_threads(). + * + **/ +typedef void *(*TPGetTaskFunc)(void *qargs); + + +/** + * TPWorkFunc: + * @work: The queue_args pointer which was given to run_threads(). + * @cookie: A small integral number which is guaranteed to be unique among all + * currently running threads. + * + * This function is called, reentrantly, for each work item. + * + **/ +typedef void (*TPWorkFunc)(void *work, int cookie); + + +/** + * TPFinalFunc: + * @qargs: The queue_args pointer which was given to run_threads(). + * @work: The pointer which was returned by your get_task function. + * + * This function is called, non-reentrantly, after each work item has been + * completed. A typical use might be to update some counters inside @qargs + * according to fields withing @work which were filled by your 'work' function. + * + **/ +typedef void (*TPFinalFunc)(void *qargs, void *work); + + +extern int run_threads(int n_threads, TPWorkFunc work, + TPGetTaskFunc get_task, TPFinalFunc final, + void *queue_args, int max, + int cpu_num, int cpu_groupsize, int cpu_offset); + + +#endif /* THREAD_POOL_H */ |