Threadpool API
typedef void *threadpool;
typedef void (*dispatch_fn)(void *);
/**
* create_threadpool
creates a fixed-sized thread
* pool. If the function succeeds, it returns a
(non-NULL)
* "threadpool", else it
returns NULL.
*/
threadpool create_threadpool(int num_threads_in_pool);
/**
* dispatch
sends a thread off to do some work. If
* all threads
in the pool are busy, dispatch will
* block until a thread becomes free and
is dispatched.
*
* Once a thread is dispatched, this
function returns
* immediately,
except in cases of a heavily loaded server.
*
* The dispatched thread calls into the
function
* "dispatch_to_here" with argument "arg".
*/
void dispatch(threadpool from_me,
dispatch_fn dispatch_to_here,
void * arg);
/**
* Works the same as dispatch, but
enables the user to define cleanup
* handlers in cases
of immediate cancel. The cleanup handler
function
*(cleaner_func) is
executed automatically with cleaner_arg as the
argument
* after the dispatch_to_here function is done; in the case that
* destroy_threadpool_immediately
is called, cleaner_func is also called before
* the threadpool exits.
*/
void dispatch_with_cleanup(threadpool
from_me, dispatch_fn dispatch_to_here,
void * arg, dispatch_fn cleaner_func, void* cleaner_arg);
/**
* destroy_threadpool
kills the threadpool, causing
* all threads
in it to commit suicide, and then
* frees all the memory associated with
the threadpool.
*/
void destroy_threadpool(threadpool
destroyme);
/**
* destroy_threadpool_immediately
cancels all threads in the threadpool
* immediately. It is potentially dangerous to use with
libraries that are not
* specifically asynchronous cancel
thread safe. Also, without cleanup
* handlers, any
dynamic memory or system resource in use could potentially be
* left without a reference to
it.
*/
void destroy_threadpool_immediately(threadpool
destroymenow);