#include #include #include #include #include #include #include #include #include "threadpool.h" int verbose = 0; struct my_threadpool { THREADPOOL threadpool; pthread_mutex_t mutex; pthread_cond_t wait; int closed; }; void my_threadpool_init(struct my_threadpool *my_threadpool, int max_threads) { int r; r = threadpool_create(&my_threadpool->threadpool, max_threads); assert(r == 0); assert(my_threadpool != 0); r = pthread_mutex_init(&my_threadpool->mutex, 0); assert(r == 0); r = pthread_cond_init(&my_threadpool->wait, 0); assert(r == 0); my_threadpool->closed = 0; } void my_threadpool_destroy(struct my_threadpool *my_threadpool) { int r; r = pthread_mutex_lock(&my_threadpool->mutex); assert(r == 0); my_threadpool->closed = 1; r = pthread_cond_broadcast(&my_threadpool->wait); assert(r == 0); r = pthread_mutex_unlock(&my_threadpool->mutex); assert(r == 0); if (verbose) printf("current %d\n", threadpool_get_current_threads(my_threadpool->threadpool)); threadpool_destroy(&my_threadpool->threadpool); assert(my_threadpool->threadpool == 0); r = pthread_mutex_destroy(&my_threadpool->mutex); assert(r == 0); r = pthread_cond_destroy(&my_threadpool->wait); assert(r == 0); } void *fbusy(void *arg) { struct my_threadpool *my_threadpool = arg; int r; r = pthread_mutex_lock(&my_threadpool->mutex); assert(r == 0); while (!my_threadpool->closed) { r = pthread_cond_wait(&my_threadpool->wait, &my_threadpool->mutex); assert(r == 0); } r = pthread_mutex_unlock(&my_threadpool->mutex); assert(r == 0); if (verbose) printf("%lu:%s:exit\n", pthread_self(), __FUNCTION__); return arg; } void *fidle(void *arg) { struct my_threadpool *my_threadpool = arg; int r; r = pthread_mutex_lock(&my_threadpool->mutex); assert(r == 0); threadpool_set_thread_idle(my_threadpool->threadpool); while (!my_threadpool->closed) { r = pthread_cond_wait(&my_threadpool->wait, &my_threadpool->mutex); assert(r == 0); } r = pthread_mutex_unlock(&my_threadpool->mutex); assert(r == 0); if (verbose) printf("%lu:%s:exit\n", pthread_self(), __FUNCTION__); return arg; } #define DO_MALLOC_HOOK 1 #if DO_MALLOC_HOOK static void *my_malloc_always_fails(size_t n, const __malloc_ptr_t p) { n = n; p = p; return 0; } #endif int usage() { printf("threadpool-test: [-v] [-malloc-fail] [N]\n"); printf("-malloc-fail simulate malloc failures\n"); printf("N max number of threads in the thread pool\n"); return 1; } int main(int argc, char *argv[]) { int max_threads = 1; int do_malloc_fail = 0; int i; for (i=1; i